java為什麼會出現精度丟失這種現象你知道嗎

很多人都知道:浮點數值不適用於無法接受舍入誤差的金融計算中,即:我們常說的丟失精度問題。

這是為什麼呢?

很多人還知道這樣一句話:這種舍入誤差的主要原因是浮點數值采用二進制系統表示, 而在二進制系統中無法精確地表示分數 1/10。這就好像十進制無法精確地表示分數 1/3—樣。

針對十進制,1除以3是除不盡的。很好理解,因為我們一直接觸的就是十進制,等於0.333333… 很好理解

但是:二進制系統中無法精確地表示分數 1/10。為啥呢。就有點不理解瞭

《Java核心技術卷》書上也是這麼寫的。

在這裡插入圖片描述

接下來我們就深究一下為什麼!!! 

重點這句話:這種舍入誤差的主要原因是浮點數值采用二進制系統表示。就是說我們在代碼中編寫的 System.out.println(4.0 – 3.6); 這樣一段代碼, 

計算過程:

①將十進制的 4.0 轉換成 二進制,將十進制的 3.6 轉換成二進制;

②使用轉換後的二進制,進行減法運算 

3.6 轉換成二進制,就類似於 1除以3一樣,是除不盡。所以 System.out.println(4.0 – 3.6); 就會輸出 0.3999999999999999

備註:

十進制的 3.6 轉換成二進制為:11.100110011001…(一直循環除不盡),就類似於 1/3 是 0.33333333333…除不盡。所以System.out.println(4.0 – 3.6); 就會輸出 0.3999999999999999

十進制的 3.6 轉換成二進制為:11.100110011001…

轉換過程參考下文⬇⬇⬇ 【4.(小數)十進制轉二進制(除不盡)】

此處涉及到進制轉換,參考下文:

涉及到:

1.二進制 轉 十進制
2.十進制 轉 二進制
3.(小數)十進制 轉 二進制

接下來,舉幾個二進制和十進制之間轉換的例子 。你就知道為什麼【除不盡】瞭

1.二進制轉十進制

二進制轉十進制

2.(整數)十進制轉二進制

十進制轉二進制

3.(小數)十進制轉二進制(可除盡)

請添加圖片描述

4.(小數)十進制轉二進制(除不盡)

請添加圖片描述

總結:  

因為 3.6 轉成二進制為 11.10011001….,除不盡的

所以 System.out.println(4.0 – 3.6); 就會輸出 0.3999999999999999

本片文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: