首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 浮點數近似誤差成因:IEEE 754 二進制表示局限

     編輯:程式設計疑難解答

核心原因

十進制小數 (如 0.1) **無法用有限二進制小數精確表示**,只能無限循環近似,導致儲存時發生捨入誤差。

示例

0.1 (十進制) = 0.00011001100110011... (二進制循環)
float 佔 32 位 (23 位尾數) → 截斷/捨入
double 佔 64 位 (52 位尾數) → 更精確但仍非精確

經典現象

System.out.println(0.1 + 0.2); // 0.30000000000000004
System.out.println(1.0 - 0.9); // 0.09999999999999998

正確處理策略

場景方案
貨幣/金融計算BigDecimal (字串構造) + 設定 MathContext/scale + RoundingMode
科學計算/圖形double + 容差比較 Math.abs(a-b) < 1e-9
顯示格式化String.format("%.2f", val) / DecimalFormat
整數縮放金額以「分」為單位存 long (10000 代表 100.00 元)

BigDecimal 正確用法

// 錯誤:new BigDecimal(0.1) 會帶入 double 的誤差
// 正確:字串構造
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // 精確 0.3

// 除法必須指定精度與捨入模式
BigDecimal div = a.divide(b, 10, RoundingMode.HALF_UP);

參考深度解析

CSDN 部落格:Java 浮點數誤差原理與解決方案

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved