为何浮点数3.14执行++自增操作结果异常?
为什么3.14执行++操作后输出4.140000000000001?
这其实是浮点数存储的精度特性导致的经典问题,咱们一步步拆解来看:
首先看你用到的测试代码:
public class test{ public static void main(String[] args){ double first = 3.14 ; first++; System.out.println(first); } }
编译运行命令:
ubuntu@john:~/Desktop$ javac test.java ubuntu@john:~/Desktop$ java test
输出结果:
4.140000000000001
核心原因:IEEE 754浮点数的精度限制
double类型是基于IEEE 754标准的64位浮点数,它没办法精确表示所有的十进制小数。原因很简单:十进制的分数转换成二进制分数时,有些会变成无限循环的二进制小数,计算机只能存储一个近似值。
拿3.14来说,它转换成二进制是一个无限循环的小数,所以当你把它赋值给double变量时,存储的已经是一个接近3.14但略有偏差的值。当你执行first++(也就是给这个近似值加1)之后,原本的微小偏差就被带了出来,最终输出的结果就成了带有尾差的4.140000000000001。
那为什么4.14执行++后看起来是5.14呢?其实不是4.14本身能被精确存储,只是它的近似值在加1之后,刚好符合浮点数的舍入规则,输出时显示成了精确的5.14而已——本质上它的存储依然是近似值,只是误差没在输出中显现。
怎么解决这个问题?
如果需要精确的十进制运算,推荐使用java.math.BigDecimal类,它可以精准处理十进制数:
import java.math.BigDecimal; public class test{ public static void main(String[] args){ BigDecimal first = new BigDecimal("3.14"); first = first.add(BigDecimal.ONE); System.out.println(first); } }
这段代码运行后会精确输出4.14。
内容的提问来源于stack exchange,提问作者CamundaGuy
相关产品推荐
相关产品推荐

