在計算雙向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