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 位?
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 位
BigDecimal。printf("%.2f") 等格式化控制顯示位數。Math.abs(a-b) < 1e-9,勿用 ==。搞清「有效精度」與「輸出格式」的區別,不再被控制台顯示誤導。