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

Java double 精度陷阱:為何 1.2+1.3+... 不等於 11.3?

     編輯:程式設計疑難解答

現象重現

執行以下代碼:

double[] myList = {1.2, 1.3, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.6, 1.2};
double total = 0;
for (double v : myList) total += v;
System.out.println("Total is: " + total); // 輸出:Total is: 11.299999999999

預期結果為 11.3,實際輸出卻是 11.299999999999。

根本原因

double 型別遵循 IEEE 754 標準,存在兩類誤差:

  1. 進制轉換誤差:十進制小數(如 1.1、1.2)在二進制中多為無限循環小數,計算機字長有限,只能截斷近似表示。
  2. 浮點運算誤差:大數與小數相加時,小數可能因對齊指數而丟失尾數精度,甚至被忽略。

解決方案

  • 貨幣/精確計算:使用 BigDecimal 類,並以字串構造器初始化(new BigDecimal("1.2"))。
  • 格式化輸出:若僅需顯示,可用 String.format("%.1f", total) 或 DecimalFormat 四捨五入。
  • 整數放大法:將數值乘以 10 或 100 轉為整數運算,最後再除回。

理解浮點數本質,避免在金融、科學計算等敏感領域直接使用 float/double 進行精確比較。

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