分割和乘法改变过程中的Java精度

时间:2011-12-06 18:06:22

标签: java double precision division multiplication

  

可能重复:
  How to resolve a Java Rounding Double issue

请帮助, 我用Java编写了一些计算器。我用双人型。 Double在小数点后有15位数字。我有以下问题:

1/3 * 3 = 0.9999999999999999

我需要1/3 * 3 = 1

我该如何解决这个问题? 我保持结果为Double。与其他数学运算相同的问题,例如

sqrt(6)= 2.449489742783,然后我将结果平方并得到:5.999999999999999

3 个答案:

答案 0 :(得分:3)

您正在处理浮点运算的固有局限性。

答案 1 :(得分:0)

某些数字无法在二进制浮点中精确表示。 1/3是其中之一。见http://en.wikipedia.org/wiki/Floating_point就此而言,1/3不能用十进制精确表示。

您的计算器应使用java.text.NumberFormat来显示数字。

答案 2 :(得分:0)

您之所以看到这种情况,是因为计算机无法理解无穷大。

计算机有局限性,所以它不理解1/3永无止境的事实。这导致它变圆。这可以通过Jason S在上面发布来解决。使用这些特殊的课程,人们已经开始计算计算机的方式,无论某些东西是否无限,然后尝试处理它。