天天看點

程式設計語言中浮點型精度損失問題(C#和Java)

看下面一段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的方式顯示結果:

程式設計語言中浮點型精度損失問題(C#和Java)

其他的語言這裡不驗證了,由java和c#得到的結果一緻可以判斷,這個誤差不取決于語言。這裡的原因其實也不複雜,無非就是因為浮點型資料在計算機中用二進制來表示,是以會産生這個誤差。

針對這個問題,在java裡面如果要進行連續的浮點型資料相加,請使用BigDecimal,在c#中也有decimal與之對應。這裡面的細節,我後續還會補充。