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

Java double/float 精度誤區:輸出位數 ≠ 有效精度

     編輯:程式設計疑難解答

現象

System.out.println(10000.0 / 3.0); // 3333.333333333335 (18 位)
float f = (float)(10000.0 / 3.0);  // 3333.3333

疑惑:double 標稱 15-16 位有效數字,為何輸出 18 位?float 7 位卻輸出 8 位?

本質解釋

  • 有效精度:二進制浮點數能精確表示的**有效數字位數**(double ≈ 15-16 位十進制,float ≈ 7-8 位)。
  • 輸出位數:System.out.println 默認調用 Double.toString,會輸出**能唯一確定該二進制值的最短十進制字符串**;往往比有效精度多 1-3 位,最後一位可能是「噪聲位」。
  • 示例中 3333.333333333335 最後 5 即為噪聲位,真實有效數字約 15 位,符合規範。

驗證代碼

double d = 10000.0 / 3.0;
System.out.printf("%.15f%n", d); // 3333.333333333333
System.out.printf("%.16f%n", d); // 3333.3333333333335
// %.15f 截斷後已穩定,說明有效精度約 15 位

最佳實踐

  1. 金融/精確計算**嚴禁**用 float/double,改用 BigDecimal。
  2. 科學計算接受微小誤差,輸出時用 printf("%.2f") 等格式化控制顯示位數。
  3. 比較浮點數用 Math.abs(a-b) < 1e-9,勿用 ==。
  4. 搞清「有效精度」與「輸出格式」的區別,不再被控制台顯示誤導。

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