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
相关产品推荐
相关产品推荐

