请帮助, 我用Java编写了一些计算器。我用双人型。 Double在小数点后有15位数字。我有以下问题:
1/3 * 3 = 0.9999999999999999
我需要1/3 * 3 = 1
我该如何解决这个问题? 我保持结果为Double。与其他数学运算相同的问题,例如
sqrt(6)= 2.449489742783,然后我将结果平方并得到:5.999999999999999
答案 0 :(得分:3)
您正在处理浮点运算的固有局限性。
abs(x-y) < epsilon
而不是x == y
答案 1 :(得分:0)
某些数字无法在二进制浮点中精确表示。 1/3是其中之一。见http://en.wikipedia.org/wiki/Floating_point就此而言,1/3不能用十进制精确表示。
您的计算器应使用java.text.NumberFormat
来显示数字。
答案 2 :(得分:0)
您之所以看到这种情况,是因为计算机无法理解无穷大。
计算机有局限性,所以它不理解1/3永无止境的事实。这导致它变圆。这可以通过Jason S在上面发布来解决。使用这些特殊的课程,人们已经开始计算计算机的方式,无论某些东西是否无限,然后尝试处理它。