看下面一段Java代碼:
double sum = 0;
double d = 1064.8;
sum += d;
System.out.println(sum);
sum += d;
System.out.println(sum);
sum += d;
System.out.println(sum);
sum += d;
System.out.println(sum);
sum += d;
System.out.println(sum);
sum += d;
System.out.println(sum);
其輸出結果爲:
1064.8
2129.6
3194.3999999999996
4259.2
5324.0
6388.8
把sum和d改爲float,則輸出結果如下:
1064.8
2129.6
3194.4001
4259.2
5324.0
6388.8
在C#中,輸出結果仍然如此,由於c#的toString方法會將3194.3999999999996輸出爲3194.4(原因我暫時未知),因此這裏我用debug的方式顯示結果:
其他的語言這裏不驗證了,由java和c#得到的結果一致可以判斷,這個誤差不取決於語言。這裏的原因其實也不復雜,無非就是因爲浮點型數據在計算機中用二進制來表示,因此會產生這個誤差。
針對這個問題,在java裏面如果要進行連續的浮點型數據相加,請使用BigDecimal,在c#中也有decimal與之對應。這裏面的細節,我後續還會補充。