Java是否会对IEEE-754表示的浮点数做舍入处理以避免精度误差?
问题原因说明
你对单精度浮点数1.6f和0.4f的独立存储值的认知是正确的,但疏漏了IEEE754浮点数运算的核心规则:两个浮点数做算术运算后,结果会按照默认的舍入模式,舍入到当前类型的有效位范围内,不会保留完整的无限精度计算结果。
具体计算过程
- 两个float的实际存储值相加的精确结果为:
2.0000000298023223876953125 - float类型仅有23位尾数,对应约7位十进制有效数字,上述精确结果距离
2.0f的差值,远小于float精度下2.0f之后下一个可表示的数值(约2.000000119f) - 按照IEEE754默认的就近舍入、偶数舍入规则,加法结果会被舍入为精确的
2.0f,因此才会出现你观察到的输出结果。
换成double输出不变的原因
即使用double类型计算,1.6和0.4的double存储值相加后的精确结果,舍入到double精度后也正好是2.0,因此输出不会发生变化。
验证方法
你可以在代码中加入如下语句打印sum的真实存储值,验证结果确实为2.0:
System.out.println(new java.math.BigDecimal(sum));
内容的提问来源于stack exchange,提问作者Vaibhav Maheshwari
相关产品推荐
相关产品推荐

