Java中單精度與雙精度浮點數精度問題


單精度浮點數

單精度浮點數最高可精確到1/2^24,也就是1/16777216,什么意思呢?就是說16777216與16777217,如果用單精度浮點數來表示,其結果是一樣的。以下Java代碼可直觀看到精度損失。

/**
 * @description: 測試單精度浮點數精度
 * @author: banmao
 * @date: 2022/1/13 12:32
 */
public class TestFloat {

    public static void main(String[] args) {
        int i = 123456789;
        float f = i;
        System.out.println(f); // 輸出為1.23456792E8
    }
}

為什么會損失精度呢?這個首先需要了解計算機中的浮點數是怎么存儲的,可閱讀計算機中存儲整數、小數與字符串
這里簡要說明下,因為計算機存儲小數是通過科學計數法來存儲的,有效位為23位,精度為24位,而上面代碼中的示例的整數為123456789,轉換成32位的二進制為111010110111100110100010101,取前24位10000010(指數) 111010110111100110100010(有效數),舍入處理為10000010(指數為3) 111010110111100110100011,其實也就是111010110111100110100011000,得出的十進制為123456792,這就是導致精度損失的原因。

雙精度浮點數

雙精度浮點數的有效數位為52位,精度為53位,於是雙精度浮點數可精確到1/2^53,也就是1/9007199254740991。

總結

1、單精度浮點數最高精確到1/16777216,雙精度浮點數最高精確到1/9007199254740991
2、整數轉浮點數可能會丟失精度,在Java中,int->float,long->float,long->double,這三種轉換可能會造成精度損失。

擴展

1.BigDecimal對於精度損失有作用嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM