關於數據精度的一些事
阿新 • • 發佈:2018-07-01
發現 精度問題 分享 In 拆分 inf bsp ima 怎麽
,2-2,2-3這些是可以精確表示的。
-
基礎數據類型
大家都知道,Java中表示小數的基本類型有float, double, 如果你想計算0.3 - 0.1,很遺憾答案並不是0.2,有些人會說,用BigDecimal就可以啦,float和double就是會存在精度問題的。本文想探究一下,為什麽, 為什麽會無法得到正確答案。
先講一些題外話,十進制和二進制。
計算機的世界是二進制,0和1組成,
二進制轉十進制不在贅述,高中就學過的;
十進制轉二進制,看下這個圖, 應該也比較清楚了:
主要來看一下,十進制小數怎麽轉化為二進制(如果是3.45這類的小數拆分為3 和0.45,3按照上面的轉換方式,0.45按照如下方式)。
這裏,底是2。舉例十進制0.1轉為二進制:
結果: 0.0
1. 0.1 * 2 = 0.2 整數0為二進制結果的第一位,即0.0;小數0.2作為源,繼續執行
2. 0.2 * 2 = 0.4 整數0為二進制結果的第二位,即0.00;小數0.4作為源,繼續執行
3. 0.4 * 2 = 0.8 整數0為二進制結果的第三位,即0.000;小數0.8作為源,繼續執行
4. 0.8 * 2 = 1.6 整數1為二進制結果的第四位,即0.0001;小數0.6作為源,繼續執行
5. 0.6 * 2 = 1.2 整數1為二進制結果的第四位,即0.00011;小數0.2作為源,繼續執行
......
最後執行下去,發現0.1轉換為二進制為(0.00011001100110011...)2
所以,十進制的0.1計算機無法精確表示。因此,0.3 - 0.1得到的就不是精確值了。不過如果你用0.5 - 0.125是可以得到0.375的,為什麽呢?因為,2-1
關於數據精度的一些事