java格式的小数百分比会产生非常奇怪的行为

时间:2012-02-13 16:58:52

标签: java number-formatting

我正在尝试使用以下代码格式化百分比:

NumberFormat fmt = NumberFormat.getPercentInstance();
fmt.setRoundingMode(RoundingMode.HALF_UP);
fmt.setMinimumFractionDigits(0);
fmt.setMaximumFractionDigits(0);
System.out.println(fmt.format(0.145));

然而,我得到一个非常奇怪的结果:

  

14%

将值0.145更改为其他值,例如0.125将正常工作,结果将符合预期

  

13%

有人可以对此有所了解吗?提前致谢

3 个答案:

答案 0 :(得分:1)

这是由于double中固有的舍入错误导致0.145四舍五入到

0.1449999999999999900079927783735911361873149871826171875

如果您希望获得完美的准确度,请使用BigDecimal

答案 1 :(得分:1)

我认为这是浮动的实习代表的结果。 (由二进制数表示的十进制数字。)

您的0.145可能在内部表示为0.144999999999 ...,因此舍入模式向下舍入。

答案 2 :(得分:1)

你应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,但基本上归结为.145不能在IEEE浮点中精确表示,因此四舍五入到可以表示的最近值,这恰好发生了略小于.145,所以当四舍五入到两位数时它会向下舍入。