在计算双向java中从1到50000的数字的和谐总和时,获得的值必须匹配,但它让我想到它们不是! 请告诉我为什么会这样。从左到右和从右到左计算谐波总和的不同值
public class Main {
public static void main(String args[]){
int maxD = 50000;
double suml2r=0, sumr2l=0;
for(int i=1; i<=maxD; i++){
suml2r += (double)(1)/i;
sumr2l += (double)(1)/(maxD-i+1);
}
System.out.println("left to right = " + suml2r);
System.out.println("right to left = " + sumr2l);
}
}
输出:
左至右= 11.397003949278504
从右到左= 11.397003949278519
这是可以预料的,因为浮点值不是数字的精确表示。可能有[100多个类似的问题](http://stackoverflow.com/questions/tagged/floating-point)。你也许应该读一些类似于[每个计算机科学家应该知道的关于浮点运算的东西]](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)和/或[“二进制浮点和.NET”](http://csharpindepth.com/Articles/General/FloatingPoint.aspx)(后者是C#,但同样适用于Java)。 – Dukeling
用'0.1 + 0.2 + 0.3'和'0.3 + 0.2 + 0.1'得到同样的问题。围绕添加每一对数字,你会更好地了解它为什么会发生。 – Tom