java為什么會出現(xiàn)精度丟失這種現(xiàn)象你知道嗎
很多人都知道:浮點數(shù)值不適用于無法接受舍入誤差的金融計算中,即:我們常說的丟失精度問題。
這是為什么呢?
很多人還知道這樣一句話:這種舍入誤差的主要原因是浮點數(shù)值采用二進(jìn)制系統(tǒng)表示, 而在二進(jìn)制系統(tǒng)中無法精確地表示分?jǐn)?shù) 1/10。這就好像十進(jìn)制無法精確地表示分?jǐn)?shù) 1/3—樣。
針對十進(jìn)制,1除以3是除不盡的。很好理解,因為我們一直接觸的就是十進(jìn)制,等于0.333333… 很好理解
但是:二進(jìn)制系統(tǒng)中無法精確地表示分?jǐn)?shù) 1/10。為啥呢。就有點不理解了
《Java核心技術(shù)卷》書上也是這么寫的。
接下來我們就深究一下為什么?。?!
重點這句話:這種舍入誤差的主要原因是浮點數(shù)值采用二進(jìn)制系統(tǒng)表示。就是說我們在代碼中編寫的 System.out.println(4.0 - 3.6); 這樣一段代碼,
計算過程:
①將十進(jìn)制的 4.0 轉(zhuǎn)換成 二進(jìn)制,將十進(jìn)制的 3.6 轉(zhuǎn)換成二進(jìn)制;
②使用轉(zhuǎn)換后的二進(jìn)制,進(jìn)行減法運算
3.6 轉(zhuǎn)換成二進(jìn)制,就類似于 1除以3一樣,是除不盡。所以 System.out.println(4.0 - 3.6); 就會輸出 0.3999999999999999
備注:
十進(jìn)制的 3.6 轉(zhuǎn)換成二進(jìn)制為:11.100110011001…(一直循環(huán)除不盡),就類似于 1/3 是 0.33333333333…除不盡。所以System.out.println(4.0 - 3.6); 就會輸出 0.3999999999999999
十進(jìn)制的 3.6 轉(zhuǎn)換成二進(jìn)制為:11.100110011001…
轉(zhuǎn)換過程參考下文⬇⬇⬇ 【4.(小數(shù))十進(jìn)制轉(zhuǎn)二進(jìn)制(除不盡)】
此處涉及到進(jìn)制轉(zhuǎn)換,參考下文:
涉及到:
1.二進(jìn)制 轉(zhuǎn) 十進(jìn)制
2.十進(jìn)制 轉(zhuǎn) 二進(jìn)制
3.(小數(shù))十進(jìn)制 轉(zhuǎn) 二進(jìn)制
接下來,舉幾個二進(jìn)制和十進(jìn)制之間轉(zhuǎn)換的例子 。你就知道為什么【除不盡】了
1.二進(jìn)制轉(zhuǎn)十進(jìn)制
2.(整數(shù))十進(jìn)制轉(zhuǎn)二進(jìn)制
3.(小數(shù))十進(jìn)制轉(zhuǎn)二進(jìn)制(可除盡)
4.(小數(shù))十進(jìn)制轉(zhuǎn)二進(jìn)制(除不盡)
總結(jié):
因為 3.6 轉(zhuǎn)成二進(jìn)制為 11.10011001....,除不盡的
所以 System.out.println(4.0 - 3.6); 就會輸出 0.3999999999999999
本片文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring Boot實戰(zhàn)之?dāng)?shù)據(jù)庫操作的示例代碼
本篇文章主要介紹了Spring Boot實戰(zhàn)之?dāng)?shù)據(jù)庫操作的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01命令行使用支持?jǐn)帱c續(xù)傳的java多線程下載器
java命令行下載器,支持?jǐn)帱c續(xù)傳下載,多線程下載,需要的朋友可以參考下2014-02-02Java日常練習(xí)題,每天進(jìn)步一點點(64)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-09-09