使用 Java 的
DecimalFormat
格式化双精度数时,我观察到一些奇怪的行为。
// returns "0.1" as expected
(new DecimalFormat("0.#", new DecimalFormatSymbols(Locale.US))).format(0.05);
// returns "0.01" as expected
(new DecimalFormat("0.##", new DecimalFormatSymbols(Locale.US))).format(0.005);
// returns "0", although I would expect it to return "0.001"
(new DecimalFormat("0.###", new DecimalFormatSymbols(Locale.US))).format(0.0005);
// returns "0", although I would expect "0.0001"
(new DecimalFormat("0.####", new DecimalFormatSymbols(Locale.US))).format(0.00005);
谁能解释为什么第三个和第四个语句返回
"0"
?
更奇怪的是:
// returns "1.105" as expected
(new DecimalFormat("#.###")).format(1.1045);
// returns "0.104" (why??)
(new DecimalFormat("#.###")).format(0.1045);
好的,刚刚找到答案。 Hovercraft 提供的链接(Odd result From DecimalFormat Rounding Half Up)确实有帮助。这不是一个舍入问题,但显然这个数字比另一个更接近它的邻居
第二组中的数字如下所示,因此四舍五入使得 感觉:
System.out.println(new BigDecimal(1.1045)); // prints 1.1045000000000000373034936274052597582340240478515625
System.out.println(new BigDecimal(0.1045)); // prints 0.10449999999999999567013020396188949234783649444580078125