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

Java11中Float解析结果与Double存在异常差异 求原理说明

浮点数精度差异原理说明

你给出的测试代码如下:

System.out.println(Float.valueOf(Float.parseFloat("76028223")).intValue());
System.out.println(Double.valueOf(Double.parseDouble("76028223")).intValue());

运行输出:

76028224
76028223

核心原理

  • 两种浮点类型的有效存储位数存在本质差异:
    • float 遵循32位IEEE 754浮点数标准,仅包含23位显式尾数(加上隐含的最高位1,总共24位有效二进制位),对应可以精确表示的十进制整数上限是2^24 = 16777216,超过这个值的整数无法保证每个都能被精确存储。
    • double 遵循64位IEEE 754浮点数标准,包含52位显式尾数(加上隐含的最高位1,总共53位有效二进制位),可精确表示的十进制整数上限是2^53 = 9007199254740992,远大于本次测试的数值。
  • 测试数值76028223的十进制位数为8位,已经超出float的精确表示范围:
    把76028223解析为float时,由于有效二进制位不足,会按照IEEE 754默认的就近舍入、偶数优先规则,进位到最近的可精确表示的整数76028224,因此转int后输出进位后的值。
    而76028223远小于double的精确表示上限,解析为double时可以完整保留原始数值,转int后结果和原值完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:51:03