Java浮點數精度陷阱:看似簡單的0.1
在Java開發中,我們經常用double類型處理小數。但看似簡單的浮點數運算,卻可能導致精度丟失。本文分析為什么直接打印0.1d看似精確,而0.3d – 0.2d的結果卻與預期不符。
示例代碼中,我們聲明一個double變量f,并賦值為0.1d。然后分別打印f的值和0.3d – 0.2d的結果。表面上看,f的值是0.1,沒問題。然而,0.3d – 0.2d的結果卻并非精確的0.1。這是因為浮點數在計算機中的存儲機制。
計算機使用二進制存儲數據,而許多十進制小數(例如0.1)無法精確地轉換成二進制數,而是無限循環的二進制小數。這類似于十進制無法精確表示三分之一(1/3 = 0.3333…)。由于計算機存儲空間有限,只能截斷這個無限循環的二進制數,從而造成精度損失。這就是0.3d – 0.2d結果與預期略有偏差的原因。
立即學習“Java免費學習筆記(深入)”;
因此,如果程序對精度要求很高(例如金融計算),不應直接使用double或Float進行運算。 BigDecimal類是更好的選擇,因為它能精確表示十進制數,避免了二進制浮點數表示帶來的精度損失。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦