这个问题在这里已有答案:
保留两个小数位,小数部分相同,结果不一致
jdk1.8.0_162
DecimalFormat df = new DecimalFormat("##.00");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println("1.985 ≈ " + df.format(1.985));
System.out.println("23.985 ≈ " + df.format(23.985));
1.985 ≈ 1.99
23.985 ≈ 23.98
输出如上,并且应与小数部分相同。
这就是floating point类型的工作原理。它们可以是近似值。两个数字的近似值并不相同,因为它们的数字不同。一个数字可能是1.985000000000001,另一个数字可能是内部的23.98499999999999。另见here。
您看到的问题来自于在代码中指定“23.985”,当表示为double时,稍微少一些。
一个可能的解决方案(如果你绝对需要它以正确的方式),就是使用BigDecimal.valueOf
来创建值。例如
//BigDecimal bd = BigDecimal.valueOf(23.985);
BigDecimal bd = new BigDecimal("23.985");
System.out.println("bd=" + bd);
System.out.println(df.format(bd)); // expected == actual