我正在尝试使用以下代码格式化百分比:
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%
有人可以对此有所了解吗?提前致谢
答案 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,所以当四舍五入到两位数时它会向下舍入。