这是Java中的一个小故障吗?
我去解决这个问题:3.1 - 7.1
我得到答案:-3.9999999999999996
这里发生了什么?
答案 0 :(得分:10)
这里可以找到一个很好的解释。 http://www.ibm.com/developerworks/java/library/j-jtp0114/
浮点运算很少精确。有些数字,如此 如0.5,可以精确地表示为二进制(基数2)十进制(因为 0.5等于2-1),其他数字,如0.1,不能。结果,浮点运算可能导致舍入误差,从而产生a 结果接近 - 但不等于 - 你可能得到的结果 期望。例如,下面的简单计算结果如下 2.600000000000001,而不是2.6:
double s=0; for (int i=0; i<26; i++) s += 0.1; System.out.println(s);
类似地,乘以.1 * 26得到的结果不同于 将.1添加到自身26次。舍入错误变得更加严重 从浮点数转换为整数时,因为转换为 积分型丢弃非积分部分,即使是计算 “看起来像”他们应该有积分值。例如, 以下陈述:
double d = 29.0 * 0.01; System.out.println(d); System.out.println((int) (d * 100));
将产生输出:
0.29 28
这可能不是你最初可能会想到的。
有关详细信息,请参阅提供的参考资料。
答案 1 :(得分:2)
正如其他几个人所提到的,如果您想获得精确的十进制值,则不能指望double
,例如:在实施货币申请时。你应该做的是仔细看看BigDecimal:
BigDecimal a = new BigDecimal("3.1");
BigDecimal b = new BigDecimal("7.1");
BigDecimal result = a.subtract(b);
System.out.println(result); // Prints -4.0
答案 2 :(得分:1)
计算机是100%所以在数学世界中是正确的,对普通人来说不是。 Java无法在特定数字上出错,因为它只是以相同方式运行但具有不同输入的代码!
P.S。谷歌如何围绕一个数字
答案 3 :(得分:1)
浮点舍入错误
与3 * 0.1 != 0.3
相同的方式(当它至少没有被编译器折叠时)
答案 4 :(得分:1)
正在进行自动类型推广,这就是结果。
这是一些需要学习的资源。
http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html
下一步是学习使用格式化程序将其格式化为给定的精度/要求。