相同的小数,不同的舍入结果?[重复]

问题描述 投票:3回答:2

这个问题在这里已有答案:

保留两个小数位,小数部分相同,结果不一致

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

输出如上,并且应与小数部分相同。

java java-8 rounding
2个回答
4
投票

这就是floating point类型的工作原理。它们可以是近似值。两个数字的近似值并不相同,因为它们的数字不同。一个数字可能是1.985000000000001,另一个数字可能是内部的23.98499999999999。另见here


0
投票

您看到的问题来自于在代码中指定“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
© www.soinside.com 2019 - 2024. All rights reserved.