为什么 DecimalFormat 在这个特定示例中表现得很奇怪?

问题描述 投票:0回答:1

使用 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); 
java decimalformat
1个回答
0
投票

好的,刚刚找到答案。 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
© www.soinside.com 2019 - 2024. All rights reserved.