进制转换

2/8/10/16/任意进制/含负数/浮点

409 次访问

进制转换

BigInt 大数支持 · 2-36 任意进制 · 8/16/32/64 位补码

位翻转:点击下方位格 toggle · 同步显示其他进制 · 位宽切换 8/16/32/64

位运算(A op B)

输入字符串,显示每个字符的 ASCII / Unicode 码(DEC / HEX / OCT / BIN / UTF-8 字节)

输入十六进制颜色(#RGB / #RRGGBB / #RRGGBBAA),自动转 RGB / HSL / CMYK

速查参考

· 十进制 ↔ 十六进制:0-9 直对应,10-15 = A-F;255 = FF / 256 = 100 / 65535 = FFFF / 2³² = 100000000

· 二进制分组:默认 4 位一组(对应一个十六进制位),便于互转

· 补码(Two's Complement):表示有符号负数。如 8 位下 -1 = 11111111 = 0xFF / -128 = 10000000

· 前缀约定0b 二进制 / 0o 八进制 / 0x 十六进制(C/Python/JS 通用)

· 36 进制:0-9 + A-Z 共 36 个符号,常用于短 ID 编码(如 8 位 36 进制 ≈ 2.8 万亿种组合)

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

💻

网络掩码计算

网络工程师配置子网时,需要将十进制 IP(192.168.1.0)转换为二进制(11000000.10101000.00000001.00000000)以手动计算子网掩码和广播地址。本工具支持 2/10 进制互转,同时处理 4 组 8 位二进制数,省去心算和逐位转换的繁琐,减少子网划分错误。

🔧

内存地址调试

嵌入式开发者在调试寄存器或内存地址时,常遇到十六进制(0xFFA3)与十进制(65443)的混用需求。本工具支持负数与浮点数的进制转换,例如将 -128 的补码表示为 0xFF80,或验证浮点数 3.14 在 IEEE 754 单精度下的十六进制值,直接比对调试器输出。

🎨

颜色值转换

UI 设计师从设计稿拿到十六进制颜色 #FF6600,但开发环境要求十进制 RGB 值(255,102,0)。本工具将 6 位 Hex 拆分为 R/G/B 三组转换,支持浮点透明度(如 #FF6600.80 对应 0.502),无需手动计算每两位十六进制对应的十进制,避免色值偏差。

🔐

编码校验辅助

安全工程师分析二进制协议数据包时,需要将抓包工具显示的十六进制字节流(如 0x4A 0x6F 0x68 0x6E)转换为 ASCII 字符串(John),或验证 CRC 校验值。本工具支持任意进制互转,可一次性转换整段十六进制序列,并保留浮点数精度,用于校验数值型字段的编码正确性。

📚

计算机教学演示

计算机基础课教师在讲解原码、反码、补码时,需要演示 -5 的二进制表示(原码 10000101 → 补码 11111011)。本工具支持负数直接转换,并显示浮点数的 IEEE 754 二进制结构,学生输入任意整数或小数即可即时看到各进制结果,辅助理解补码运算和浮点精度损失原理。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (rapidtables.com)传统方法
数据隐私纯浏览器端计算,输入数据不上传服务器输入数据通过 HTTP 发送至服务器处理依赖人工计算或本地安装的软件(如计算器)
处理速度毫秒级,输入即出结果受网络延迟影响,约 1-3 秒数秒至数分钟,取决于数字长度和人工熟练度
离线可用完全离线,无需网络连接必须联网完全离线
支持的进制范围2 至 36 进制(含任意进制)2、8、10、16 进制(固定选项)取决于使用的工具(如 Windows 计算器仅支持 2/8/10/16)
负数与浮点支持支持负数、浮点数(如 -A.BC)不支持负数,浮点数支持有限人工计算可处理,但易出错
平台依赖任何现代浏览器(PC/手机/平板)任何现代浏览器需专用软件(如科学计算器)或纸笔
收费与注册免费,无需注册免费,无注册要求免费(人工)或需购买软件

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例8 个典型场景,覆盖常规、边界与易错

输入输出说明
2552: 11111111 8: 377 10: 255 16: FF典型场景:十进制 255 的常用进制转换
10102: 1111110010 8: 1762 10: 1010 16: 3F2典型场景:二进制 1010 自动识别为十进制
-422: -101010 8: -52 10: -42 16: -2A边界 case:负整数在二进制中带负号前缀
3.142: 11.001000111101011100001010001111010111000010100011111 8: 3.107534121727024 10: 3.14 16: 3.23D70A3D70A3D边界 case:浮点数转换,二进制无限循环
02: 0 8: 0 10: 0 16: 0边界 case:零值在所有进制下均为 0
FF2: 11111111 8: 377 10: 255 16: FF易错 case:十六进制 FF 自动识别为十六进制
0x1A2: 11010 8: 32 10: 26 16: 1A易错 case:支持 0x 前缀的十六进制格式
123.4562: 1111011.011101001011110001101010011111101111100111011 8: 173.351232763767 10: 123.456 16: 7B.74BC6A7EF9DB典型场景:含小数的十进制数转换

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 负数用短横线而非减号输入

错误
−10
修复
-10

Unicode 减号(U+2212)与 ASCII 连字符-减号(U+002D)不同;工具解析器只识别标准 ASCII 负号,粘贴 Word 或网页中的减号会导致解析失败

2. 浮点数用逗号作为小数点

错误
3,14159
修复
3.14159

欧洲国家习惯用逗号做小数点分隔符,但编程语言和本工具统一使用英文句点;输入逗号会被当作非法字符

3. 二进制输入包含非 0/1 字符

错误
1010 1101
修复
10101101

二进制只接受 0 和 1;空格、字母、标点都会触发校验错误。若需分组阅读,建议在输入框外自行加空格

4. 十六进制输入带 0x 前缀

错误
0xFF
修复
FF

0x 是编程语言中的字面量前缀,本工具直接处理纯数字字符串;输入 0x 会被当作非法字符 x 导致转换失败

5. 任意进制输入超出基数范围

错误
在 3 进制下输入 5
修复
在 3 进制下只输入 0,1,2

任意进制模式下,每位数字必须小于基数(0 到 base-1);输入大于等于基数的数字会被标记为非法

6. 浮点数转换后精度丢失误认为工具错误

错误
输入 0.1(十进制)→ 二进制结果 0.0001100110011001...(无限循环)
修复
理解 IEEE 754 浮点表示法下 0.1 无法精确存储

0.1 在二进制中是无限循环小数,工具只能截断到有限位(通常 52 位尾数);这不是 bug,而是浮点数标准的固有特性

7. 把十进制小数直接当作整数转换

错误
输入 3.14 但期望得到 11.001001...
修复
确认工具支持浮点模式,或手动拆分为整数部分 3 和小数部分 0.14 分别转换

部分进制转换工具只处理整数,本工具支持浮点;若误用仅整数模式,小数部分会被直接丢弃

8. 在进制间转换时混淆输出格式

错误
输入十进制 255,期望输出二进制 11111111,但看到的是 FF(十六进制)
修复
转换前检查目标进制下拉框是否选对了(2 进制、8 进制、10 进制、16 进制或自定义)

工具默认保留上次使用的目标进制;若上次转换后未重置,输出进制可能与预期不同

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

N = \sum_{i=0}^{n-1} d_i \times b^i

变量说明

  • N — 十进制数值
  • b — 目标进制(2 ≤ b ≤ 36)
  • d_i — 第 i 位的数字(0 ≤ d_i < b)
  • n — 整数部分的总位数

示例

将二进制 1101.01 转为十进制。整数部分:1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1=13。小数部分:0×2⁻¹ + 1×2⁻² = 0+0.25=0.25。结果:13.25。

适用范围

适用于任意进制(2~36)整数与浮点数的正向转换。负数通过符号位单独处理,不改变公式结构。不适用于非标准进制(如负进制、混合进制)。

原理图

输入数字 + 源进制目标进制本地转换解析符号/整数/小数按位权展开计算输出目标进制数字(含符号/小数点)关键处理细节支持负数(-号保留)、浮点数(小数点处理)任意进制(2-36):按位权公式逐位转换,纯浏览器计算,数据不上传结果即时显示,无网络延迟,适合批量/快速转换
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import math

def convert_base(num_str: str, from_base: int, to_base: int) -> str:
    """任意进制转换,支持负数和小数"""
    if from_base < 2 or to_base < 2:
        raise ValueError("进制必须 >= 2")
    
    negative = num_str.startswith('-')
    if negative:
        num_str = num_str[1:]
    
    # 分离整数和小数部分
    parts = num_str.split('.')
    int_part = parts[0]
    frac_part = parts[1] if len(parts) > 1 else ''
    
    # 转十进制整数
    decimal_int = int(int_part, from_base) if int_part else 0
    
    # 转十进制小数
    decimal_frac = 0.0
    if frac_part:
        for i, digit in enumerate(frac_part):
            decimal_frac += int(digit, from_base) * (from_base ** -(i + 1))
    
    # 十进制整数转目标进制
    if decimal_int == 0:
        result_int = '0'
    else:
        digits = []
        n = abs(decimal_int)
        while n > 0:
            digits.append('0123456789ABCDEF'[n % to_base])
            n //= to_base
        result_int = ''.join(reversed(digits))
    
    # 十进制小数转目标进制(精度 10 位)
    result_frac = ''
    if decimal_frac > 0:
        f = decimal_frac
        for _ in range(10):
            f *= to_base
            digit = int(f)
            result_frac += '0123456789ABCDEF'[digit]
            f -= digit
            if f == 0:
                break
    
    result = ('-' if negative else '') + result_int
    if result_frac:
        result += '.' + result_frac
    return result

# 示例:十进制 255.5 → 十六进制
print(convert_base('255.5', 10, 16))  # FF.8

# 示例:二进制 -1010.11 → 八进制
print(convert_base('-1010.11', 2, 8))  # -12.6
package main

import (
	"fmt"
	"math/big"
	"strings"
)

// ConvertBase 任意进制转换,支持负数和小数
func ConvertBase(numStr string, fromBase, toBase int) (string, error) {
	if fromBase < 2 || toBase < 2 {
		return "", fmt.Errorf("进制必须 >= 2")
	}

	negative := strings.HasPrefix(numStr, "-")
	if negative {
		numStr = numStr[1:]
	}

	// 分离整数和小数
	parts := strings.Split(numStr, ".")
	intPart := parts[0]
	fracPart := ""
	if len(parts) > 1 {
		fracPart = parts[1]
	}

	// 解析整数部分
	intVal := new(big.Int)
	intVal.SetString(intPart, fromBase)

	// 解析小数部分
	fracVal := new(big.Rat)
	if fracPart != "" {
		fracNum := new(big.Int)
		fracNum.SetString(fracPart, fromBase)
		fracDen := new(big.Int).Exp(big.NewInt(int64(fromBase)), big.NewInt(int64(len(fracPart))), nil)
		fracVal.SetFrac(fracNum, fracDen)
	}

	// 整数转目标进制
	resultInt := intVal.Text(toBase)

	// 小数转目标进制(精度 10 位)
	resultFrac := ""
	if fracVal.Num().BitLen() > 0 {
		f := new(big.Rat).Set(fracVal)
		for i := 0; i < 10; i++ {
			f.Mul(f, big.NewRat(int64(toBase), 1))
			num, _ := f.Float64()
			digit := int(num)
			resultFrac += fmt.Sprintf("%X", digit)
			f.Sub(f, big.NewRat(int64(digit), 1))
			if f.Num().BitLen() == 0 {
				break
			}
		}
	}

	result := ""
	if negative {
		result = "-"
	}
	result += resultInt
	if resultFrac != "" {
		result += "." + resultFrac
	}
	return result, nil
}

func main() {
	// 示例:十进制 255.5 → 十六进制
	result, _ := ConvertBase("255.5", 10, 16)
	fmt.Println(result) // FF.8

	// 示例:二进制 -1010.11 → 八进制
	result, _ = ConvertBase("-1010.11", 2, 8)
	fmt.Println(result) // -12.6
}
/**
 * 任意进制转换,支持负数和小数
 * @param {string} numStr - 输入数字字符串
 * @param {number} fromBase - 原进制 (2-36)
 * @param {number} toBase - 目标进制 (2-36)
 * @returns {string} 转换结果
 */
function convertBase(numStr, fromBase, toBase) {
  if (fromBase < 2 || toBase < 2) {
    throw new Error('进制必须 >= 2');
  }

  const negative = numStr.startsWith('-');
  if (negative) numStr = numStr.slice(1);

  // 分离整数和小数
  const [intPart, fracPart = ''] = numStr.split('.');

  // 整数部分转换
  const decimalInt = parseInt(intPart, fromBase);
  const resultInt = decimalInt.toString(toBase).toUpperCase();

  // 小数部分转换
  let resultFrac = '';
  if (fracPart) {
    // 将小数部分转为十进制
    let decimalFrac = 0;
    for (let i = 0; i < fracPart.length; i++) {
      decimalFrac += parseInt(fracPart[i], fromBase) * Math.pow(fromBase, -(i + 1));
    }

    // 十进制小数转目标进制(精度 10 位)
    let f = decimalFrac;
    for (let i = 0; i < 10; i++) {
      f *= toBase;
      const digit = Math.floor(f);
      resultFrac += digit.toString(toBase).toUpperCase();
      f -= digit;
      if (f === 0) break;
    }
  }

  let result = (negative ? '-' : '') + resultInt;
  if (resultFrac) result += '.' + resultFrac;
  return result;
}

// 示例:十进制 255.5 → 十六进制
console.log(convertBase('255.5', 10, 16)); // FF.8

// 示例:二进制 -1010.11 → 八进制
console.log(convertBase('-1010.11', 2, 8)); // -12.6

常见问题

10 个高频疑问

负数怎么转进制?比如 -255 转二进制应该是什么?
本工具支持负数转换。输入 -255 后选择「10 进制 → 2 进制」,结果会显示带负号的二进制表示,如 -11111111。注意:这是「符号-数值」表示法,不是计算机内部的补码格式。如果需要补码表示(比如编程用),需要手动取绝对值转二进制后按位取反加一。工具不处理补码,只做数学上的进制转换。
浮点数转二进制结果为什么有这么多位?能限制小数位吗?
浮点数在二进制中很多是无限循环小数(如 0.1 转二进制是 0.0001100110011...),所以结果会很长。本工具默认显示到小数点后 32 位,不自动截断以免丢失精度。如果需要有限位,可以在结果区手动复制前几位,或者输入时用分数(如 1/10)代替小数。工具不做四舍五入,保持原始数学转换值。
任意进制是什么意思?支持 3 进制、7 进制吗?
任意进制指不限于常见的 2/8/10/16 进制,可以输入 2 到 36 之间的任何进制。3 进制、7 进制、20 进制都可以。超过 10 进制的数字会使用字母 A-Z 表示 10-35。例如 20 进制下,10 用 A 表示,35 用 Z 表示。输入非法的数字(比如 3 进制下出现数字 4)会提示错误,不会自动忽略。
转换结果和计算器算的不一样,谁是对的?
可以先检查双方是否用了相同的进制定义。常见差异来源:1)本工具用「0-9 + A-Z」标准表示,但某些计算器可能用小写字母或省略前导零。2)浮点数转换时,本工具做精确数学转换,而计算器可能做了四舍五入。3)负数用「符号-数值」法,但某些工具默认用补码。建议用整数 255 转 16 进制(应为 FF)快速验证,如果一致则工具没问题。
能转非常大的数吗?比如 10 亿转二进制?
可以。本工具在浏览器端用 JavaScript 大整数运算,理论上支持任意精度整数,10 亿、100 亿都没问题。但注意:超大数(如 10^15 以上)转二进制会生成很长的字符串(约 50 位以上),页面显示可能需横向滚动查看。浮点数受 IEEE 754 双精度限制,超过 2^53(约 9e15)的整数会丢失精度,建议用整数模式输入。
工具需要联网吗?没网能不能用?
完全不需要联网。所有转换逻辑都在浏览器本地执行,不发送任何数据到服务器。打开页面后可以断网使用,刷新页面仍然能工作(除非浏览器清空了缓存)。隐私方面:输入的任何数字都不会离开你的设备,适合处理敏感数据。如果发现工具无法使用,检查浏览器是否禁用了 JavaScript,或者页面是否被安全软件拦截了本地脚本。
为什么输入字母转不了?我想把 'ABC' 转成数字。
本工具做的是「数值进制转换」,不是「字符编码转换」。输入框只能接受数字字符(0-9)和表示进制的字母(A-F 对应 16 进制等)。如果你想将 'ABC' 当作一个数值来转换,需要先确定它属于哪个进制——比如把它看作 16 进制数,数值为 2748。如果想把英文字母转换成二进制编码(如 ASCII 码),需要用另一类字符编码工具,本工具不支持。
手机浏览器上能用吗?输入框太小怎么办?
手机浏览器可以使用,页面适配了移动端布局。如果输入框太小,可以横屏使用,或者点击输入框后系统会自动放大。注意:部分手机输入法默认是中文状态,输入数字和字母时需切换到英文输入法。转换按钮在输入框下方,结果区支持长按复制。如果结果太长(如浮点数转二进制),可以双指缩放页面查看完整内容。
0.1 + 0.2 转十进制为什么不是 0.3?工具算错了吗?
工具没算错,这是浮点数二进制表示的固有问题。0.1 和 0.2 在二进制中是无限循环小数,计算机存储时只能近似表示,相加后得到 0.30000000000000004。本工具做的是逐进制转换,不是算术运算。如果你输入 0.1 转二进制,再转回十进制,得到的也是 0.10000000000000000555,因为 0.1 本身就不精确。想验证工具正确性,建议用整数(如 255 → FF)测试。
能一次转换多个数字吗?比如批量转一堆十六进制。
目前输入框只支持单个数字转换,不支持批量。如果需要转换多个值,只能逐个输入。如果数据量很大(比如几十个),建议用 Excel 的 DEC2HEX / HEX2DEC 等函数批量处理,或者用编程语言(如 Python 的 int() 函数)写脚本。本工具定位是快速单次转换,不做批量处理,以免结果区过长影响阅读。
选择 打开 +新窗口 esc关闭