編程語言中浮點型精度損失問題(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的方式顯示結果:

其他的語言這裏不驗證了,由java和c#得到的結果一致可以判斷,這個誤差不取決於語言。這裏的原因其實也不復雜,無非就是因爲浮點型數據在計算機中用二進制來表示,因此會產生這個誤差。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章