You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现十进制与十六进制非指数形式浮点数互转?

浮点数转非指数形式十六进制的实现

Python的float.hex()方法返回的是IEEE 754浮点数标准的十六进制指数表示(即0x1.xxxxp±n格式),这和你需要的数值直接映射的十六进制形式(如0x2a.0)不是一回事。要实现后者,需要手动拆分整数和小数部分分别转换后拼接。

实现函数

下面是一个可以将浮点数转换为非指数形式十六进制字符串的函数:

def float_to_hex(num):
    # 处理负数符号
    sign = '-' if num < 0 else ''
    num = abs(num)
    
    # 拆分整数与小数部分
    int_part = int(num)
    frac_part = num - int_part
    
    # 整数部分转十六进制(去掉默认的0x前缀)
    int_hex = hex(int_part)[2:]
    
    # 处理小数部分:循环乘以16取整,直到小数部分趋近于0
    frac_hex_digits = []
    if frac_part > 0:
        # 设置精度阈值,避免因浮点数精度问题无限循环
        while frac_part > 1e-10:
            frac_part *= 16
            digit = int(frac_part)
            frac_hex_digits.append(hex(digit)[2:])
            frac_part -= digit
    else:
        frac_hex_digits.append('0')
    
    # 拼接结果
    return f"{sign}0x{int_hex}.{''.join(frac_hex_digits)}"

测试示例

# 测试整数浮点数
print(float_to_hex(42.0))  # 输出: 0x2a.0
# 测试带小数的浮点数
print(float_to_hex(42.5))  # 输出: 0x2a.8
print(float_to_hex(0.125)) # 输出: 0x0.2
print(float_to_hex(-10.375)) # 输出: -0xa.6

反向转换说明

你已经知道float.fromhex()支持直接解析这种非指数形式的十六进制字符串,比如:

float.fromhex('2a.8')  # 输出: 42.5
float.fromhex('0.2')   # 输出: 0.125

这个方法可以完美实现你需要的十六进制到十进制浮点数的转换。

注意事项

对于像0.1这类无法用有限二进制(进而有限十六进制)小数精确表示的数值,函数会根据设置的精度阈值截断,得到的是近似的十六进制表示。

内容的提问来源于stack exchange,提问作者Åsmund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:02:38