计算工具 · 数学计算

进制转换

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

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 49 次使用
任一行可编辑 · 支持 0x 0b 0o 前缀、负数、小数与任意大数
2二进制bin
8八进制oct
10十进制dec
16十六进制hex
就绪 · 整数走 BigInt 任意精度,小数模式约 15 位有效数字
第一节

关于本工具

About

调试串口协议时,一个十六进制0x1F换算成二进制是00011111还是00011110,手算容易错,尤其带负数的浮点数。这个工具在输入框打下数字和进制,即时出2、8、10、16及任意2-36进制结果,负数与浮点同样处理。所有运算在浏览器本地完成,无数据上传,适合嵌入式开发、网络工程或计算机教学现场核对。

使用场景

IP子网掩码换算

网络工程师在配置 VLAN 时,需要将 192.168.1.0/27 的子网掩码从十进制点分格式(255.255.255.224)换算为十六进制(0xFFFFFFE0)写入交换机 ACL。手动逐位换算容易在借位时写错,导致整个子网不可达。用本工具将 255.255.255.224 转为十六进制,同时校验二进制位是否连续,确保策略下发前掩码无误。

PLC寄存器地址解码

自动化工程师从三菱 FX3U 系列 PLC 的程序中读到一段十六进制数据 D100 = 0x0F3C,需要转换为十进制 3900 来比对传感器量程。手算时把 0xF3C 误读为 0xFC3,导致量程超限报警误判。本工具支持 2/8/10/16 进制互转,输入 0x0F3C 直接得到 3900,避免高位错位。

浮点数进制校验

嵌入式开发者在调试 STM32 的 ADC 采样值时,串口输出的是十六进制浮点表示 0x447A0000,需要确认其对应的十进制是否为 1000.0。用本工具将该 32 位十六进制数按 IEEE 754 单精度解析,得到浮点值 1000.0,验证了 SPI 传输中字节序没有反转。

负数补码验证

学生在学习《计算机组成原理》时,作业要求将 -128 的 8 位补码(0x80)转换为原码。按常规取反加一操作得到 0x100,但 8 位寄存器无法容纳进位。用本工具输入 -128 并指定 8 位输出,直接显示补码 0x80 且提示溢出,帮助学生理解补码表示的范围边界。

任意进制密钥生成

安全运维人员在生成 32 位 WPA2 预共享密钥时,要求密钥仅包含数字和大小写字母(36 进制字符集)。用本工具将随机数种子(十进制)转换为 36 进制字符串,得到 0-9A-Z 组成的密钥,避免手动挑选字符时遗漏或重复,且不经过任何在线服务器,密钥仅在本地浏览器中计算。

对比矩阵

维度本工具竞品 A(在线进制转换站)传统方法(手动计算 / 计算器)
负数支持直接输入负号,支持负进制转换多数仅正整数,负号报错或忽略需手动处理补码或符号位
浮点数直接输入小数,保留精度转换仅整数,小数报错或截断需分整数/小数部分分别计算后拼接
任意进制2-36 进制任意输入输出(含自定义进制)固定 2/8/10/16,无自定义进制 >16 需自编转换表
隐私全部在浏览器本地计算,不上传数据数据发往服务器处理完全离线,无隐私风险
速度毫秒级即时响应(纯前端)依赖网络,有 0.5-2 秒延迟依赖计算能力,复杂进制需数分钟
操作步骤输入数值→选进制→出结果,共 3 步需选方向(X进制→Y进制),步骤多 1 步需查表/写公式/多次计算,至少 5 步
第二节

使用指南

Getting Started

使用步骤

  1. 1在「原进制」下拉框选择输入数字的当前进制(2/8/10/16 或自定义 3-36),输入框内键入数字,支持负数和小数
  2. 2在「目标进制」下拉框选择要转换到的进制,结果区立即显示转换后的数值,无延迟
  3. 3若需要自定义进制(如 3 进制),在「原进制」或「目标进制」下拉框选择「自定义」,并在弹出的输入框中填写基数(2-36)
  4. 4点击结果区右侧的复制图标,将转换结果复制到剪贴板,可直接粘贴到其他应用

输入输出示例

输入输出说明
255(十进制 → 十六进制)FF常规:一字节最大值,验证基本换算
0(十进制 → 二进制)0边界:零的处理,很多实现会错成空串
-10(十进制 → 十六进制)-A(符号位保留)易错:负数各工具口径不一,本工具保留负号,不转补码
3.14(十进制 → 二进制)11.001000111101011100001010001111010111000010100011111边界:浮点数转换,展示有限精度,非无限循环
1A(十六进制 → 十进制)26常规:带字母的十六进制输入,验证字母大小写兼容
11111111(二进制 → 八进制)377常规:8位二进制最大值转八进制,验证分组转换
Z(任意进制 → 十进制,基数为36)35边界:36进制最大数字符,验证任意进制上限
-0.5(十进制 → 八进制)-0.4易错:负浮点数转换,验证符号与小数部分同时处理

常见错误对照

1.负数输入时误用全角负号

✗ 错误-15(全角短横)
✓ 修复-15(半角减号)

全角负号(U+FF0D)与半角减号(U+002D)编码不同,解析器只识别半角,导致被当作非法字符。

2.浮点进制转换时直接截断小数位

✗ 错误十进制 0.1 转二进制,手动写 0.0001(截断)
✓ 修复0.00011001100110011001101(循环)

0.1 在二进制中是无限循环小数,截断会引入误差。工具内部用高精度浮点或分数表示,手动截断结果不精确。

3.任意进制输入中混入超出基数的数字

✗ 错误基数 3 的进制里输入 123(含数字 3)
✓ 修复基数 3 的进制里输入 122(最大数字 2)

任意进制(如三进制)每位数字必须小于基数(0~2)。输入 3 会被解析器当作非法字符或自动忽略,导致转换结果错误。

4.十六进制中误用字母 O 代替数字 0

✗ 错误十六进制 1O(字母 O)
✓ 修复十六进制 10(数字 0)

十六进制数字只有 0-9 和 A-F。字母 O 不在合法字符集内,解析器会报错或跳过,结果与预期完全不同。

5.二进制输入中混入空格或分隔符

✗ 错误1010 0101(中间有空格)
✓ 修复10100101(连续无空格)

工具输入框默认不处理空格,空格会被当作非法字符。若需分组可先输入再手动删除空格,或使用工具自带的分组功能(如有)。

6.负数与浮点同时输入时符号位置错误

✗ 错误10.5-(负号在末尾)
✓ 修复-10.5(负号在开头)

数值表示规范中负号必须位于数字最前面。末尾负号不符合任何进制解析规则,会被当作非法字符或忽略。

7.转换目标进制时误用小数基数值

✗ 错误想转八进制,输入基数 8.0
✓ 修复输入基数 8(整数)

基数必须是整数(2~36 或自定义范围),浮点基数无意义。输入 8.0 可能被截断为 8 或直接报错,取决于解析实现。

第三节

工作原理

How It Works

核心公式

N = sum_{i=0}^{n-1} d_i × B^i

变量说明

  • N十进制数值
  • B目标进制,如 2/8/10/16
  • d_i第 i 位数字,0 ≤ d_i < B
  • n整数部分位数

示例

将十进制 255.625 转为十六进制:整数部分 255 ÷ 16 = 15 余 15 → 0xFF;小数部分 0.625 × 16 = 10.0 → 0.A;合并为 0xFF.A。验证:15×16¹ + 15×16⁰ + 10×16⁻¹ = 240 + 15 + 0.625 = 255.625。

输入数字(含负数/浮点)选择源进制(2/8/10/16/任意)校验 & 转换(按位/查表)选择目标进制(2/8/10/16/任意)输出结果(目标进制展示)输入数字(含负数/浮点)
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

5 种主流语言实现,复制即用:

import struct def any_base_to_decimal(num_str: str, base: int) -> int: """将任意进制字符串(2-36)转为十进制整数,支持负数""" if base < 2 or base > 36: raise ValueError("base must be 2-36") negative = num_str.startswith('-') if negative: num_str = num_str[1:] try: result = int(num_str, base) # int() 原生支持 2-36 进制 except ValueError as e: raise ValueError(f"Invalid input for base {base}: {e}") return -result if negative else result # 示例:十六进制 'FF' -> 255 print(any_base_to_decimal('FF', 16)) # 255 # 示例:二进制 '-1010' -> -10 print(any_base_to_decimal('-1010', 2)) # -10
function decimalToAnyBase(num, base) { if (base < 2 || base > 36) throw new Error('base must be 2-36'); if (num === 0) return '0'; const negative = num < 0; num = Math.abs(num); const digits = '0123456789abcdefghijklmnopqrstuvwxyz'; let result = ''; while (num > 0) { result = digits[num % base] + result; num = Math.floor(num / base); } return negative ? '-' + result : result; } // 示例:十进制 255 -> 十六进制 'ff' console.log(decimalToAnyBase(255, 16)); // 'ff' // 示例:十进制 -10 -> 二进制 '-1010' console.log(decimalToAnyBase(-10, 2)); // '-1010'
package main import ( "fmt" "math/big" "strings" ) // decimalToBase 将十进制整数转为任意进制(2-62),支持负数 func decimalToBase(num int64, base int) string { if base < 2 || base > 62 { panic("base must be 2-62") } if num == 0 { return "0" } negative := num < 0 if negative { num = -num } const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var result []byte for num > 0 { result = append([]byte{charset[num%int64(base)]}, result...) num /= int64(base) } if negative { result = append([]byte{'-'}, result...) } return string(result) } func main() { // 示例:十进制 255 -> 十六进制 'ff' fmt.Println(decimalToBase(255, 16)) // 'ff' // 示例:十进制 -10 -> 二进制 '-1010' fmt.Println(decimalToBase(-10, 2)) // '-1010' // 使用 big.Int 处理大数 n := new(big.Int) n.SetString("12345678901234567890", 10) fmt.Println(n.Text(16)) // 内置方法,支持 2-62 进制 }
#!/bin/bash # 使用 bc 进行任意进制转换(2-16 进制,支持浮点) # 注意:bc 的 obase/ibase 需注意输入输出顺序 # 示例:十六进制 'FF' -> 十进制 255 echo "ibase=16; FF" | bc # 255 # 示例:十进制 255 -> 十六进制 'FF' echo "obase=16; 255" | bc # FF # 示例:二进制 '-1010.1' -> 十进制 -10.5(bc 支持浮点) echo "ibase=2; -1010.1" | bc # -10.5 # 注意:bc 的 ibase 和 obase 默认是十进制,设置后会影响后续输入 # 更安全的做法:先设 ibase=10,再设 obase echo "obase=16; ibase=10; 255" | bc # FF
public class BaseConverter { // 将十进制整数转为任意进制(2-36),支持负数 public static String decimalToBase(long num, int base) { if (base < 2 || base > 36) { throw new IllegalArgumentException("base must be 2-36"); } if (num == 0) return "0"; boolean negative = num < 0; num = Math.abs(num); StringBuilder sb = new StringBuilder(); while (num > 0) { long digit = num % base; char c = (digit < 10) ? (char)('0' + digit) : (char)('a' + digit - 10); sb.insert(0, c); num /= base; } return negative ? "-" + sb.toString() : sb.toString(); } public static void main(String[] args) { // 示例:十进制 255 -> 十六进制 'ff' System.out.println(decimalToBase(255, 16)); // 'ff' // 示例:十进制 -10 -> 二进制 '-1010' System.out.println(decimalToBase(-10, 2)); // '-1010' // 使用 Long.toString 内置方法(支持 2-36) System.out.println(Long.toString(255, 16)); // 'ff' } }
第五节

常见问题

Q & A
负数怎么转二进制?我想转 -5 的二进制,输进去直接报错了

本工具支持负数转换。输入 -5 后,默认输出的是带符号的二进制表示(如 -101),而非计算机内部的补码形式。如果报错,检查输入框是否有多余空格或全角符号。若需要补码结果(如 32 位下 -5 的补码是 11111111111111111111111111111011),请先选择“补码”或“有符号”模式(若工具提供该选项),或手动按“取反加一”计算。

浮点数转二进制为什么后面一堆数字,跟书上学的不一样?

浮点数在计算机中采用 IEEE 754 标准存储,转二进制时分为符号位、指数位和尾数位,不是简单的整数除二取余。例如 0.1 的二进制是无限循环小数 0.0001100110011...,所以显示结果末尾会有很多位。本工具按标准单精度(32 位)或双精度(64 位)输出,若只想要精确的十进制小数转二进制结果,请将小数部分单独输入并乘以 2 取整手动计算。

任意进制是啥意思?我能不能把 123 转成三进制?

可以。本工具支持 2 到 36 进制之间的任意互转,包括三进制、四进制等非常用进制。输入数字时需确保数字在目标进制范围内(如三进制只能使用 0、1、2 三个字符)。例如十进制 123 转三进制:123 ÷ 3 = 41 余 0,41 ÷ 3 = 13 余 2,13 ÷ 3 = 4 余 1,4 ÷ 3 = 1 余 1,1 ÷ 3 = 0 余 1,倒序得 11120。工具会直接给出结果。

为什么我输入 0x1A 转十进制,结果不是 26?

本工具接受“0x”前缀表示十六进制,但输入前请确认当前输入进制已选为“十六进制”。若输入框当前进制是默认的十进制,则“0x1A”会被当成普通字符串,导致解析失败或错误结果。正确操作:先点选“十六进制”输入模式,再输入 1A 或 0x1A(前缀可选),再点转换。若仍不对,检查是否混入了全角字母或空格。

这个转换是在我电脑上算的还是上传到服务器的?网断了还能用吗?

本工具完全在浏览器本地运行(JavaScript 实现),所有计算不向服务器发送任何数据,断网后依然可以正常使用。输入的数字、转换结果都不会被记录或上传。适合处理敏感数据(如内部代码片段、密码学练习中的数值)。若页面刷新,之前的结果会丢失,建议转换后及时复制保存。

我有个 64 位的十六进制数,转成十进制为什么显示不全或者变成科学计数法?

JavaScript 的 Number 类型能精确表示的整数范围是 -2^53 到 2^53(约 9007199254740992),超出此范围的大整数会丢失精度,并以科学计数法显示(如 1.23456789e+19)。本工具若未使用 BigInt 库,则对超过 16 位的十进制数字无法保证精确转换。建议将大数拆分为高位和低位分别转换,或使用支持任意精度的大数计算工具。

八进制和十六进制除了数字位数少,实际用起来有啥区别?我该用哪个?

八进制(每 3 位二进制压缩为 1 位)在 Unix 文件权限(如 chmod 755)、早期计算机系统中常见;十六进制(每 4 位二进制压缩为 1 位)更通用,尤其在内存地址、颜色值(#FF0000)、MAC 地址、汇编指令中。日常编程和调试建议优先用十六进制,因为与字节对齐(1 字节 = 2 位十六进制),阅读和计算更直观。如果你在处理 Linux 权限或老旧系统,八进制更方便。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭