Java,四舍五入到小数点后两位(四舍五入到 0.05)
Java, Round double to two decimal (round to 0.05)
我想在 java 中四舍五入。我希望它像这样四舍五入:
- 24.04 应该给 24.05
- 24.07 应该给 24.05
- 24.02 = 24.00
- 24.08 = 24.10
我尝试像这样使用圆形:
amount = amount *10;
amount = Math.round(amount)/10;
但是,如您所见,这是行不通的。
感谢您的回答!
Math.round(amount * 20) / 20f
是一种方法。
请注意,由于 float 的内部二进制表示形式(double 也是如此),使用 float 进行舍入可能会产生错误。
所以像 Math.round(amount * 20) / 20f
这样的操作对于 23.01 的数量可以得到结果 23.000000003(这是一个我没有检查过的例子,但是使用一些测试很容易找到问题)。
改用BigDecimal
。
我会这样做:
double[] amounts = new double[]{24.04, 24.07, 24.02, 24.08};
for(double d : amounts){
double d2 = Math.round(d * 20) / 20.0;
System.out.println(String.format("%.2f -> %.2f",d,d2));
}
结果是这样的:
24,04 -> 24,05
24,07 -> 24,05
24,02 -> 24,00
24,08 -> 24,10
[编辑]
正如其他人所建议的那样,可能存在一些精度错误。如果您按照我的示例中的建议打印它,它很可能永远不会可见。但这取决于你需要这个号码做什么....
我想在 java 中四舍五入。我希望它像这样四舍五入:
- 24.04 应该给 24.05
- 24.07 应该给 24.05
- 24.02 = 24.00
- 24.08 = 24.10
我尝试像这样使用圆形:
amount = amount *10;
amount = Math.round(amount)/10;
但是,如您所见,这是行不通的。
感谢您的回答!
Math.round(amount * 20) / 20f
是一种方法。
请注意,由于 float 的内部二进制表示形式(double 也是如此),使用 float 进行舍入可能会产生错误。
所以像 Math.round(amount * 20) / 20f
这样的操作对于 23.01 的数量可以得到结果 23.000000003(这是一个我没有检查过的例子,但是使用一些测试很容易找到问题)。
改用BigDecimal
。
我会这样做:
double[] amounts = new double[]{24.04, 24.07, 24.02, 24.08};
for(double d : amounts){
double d2 = Math.round(d * 20) / 20.0;
System.out.println(String.format("%.2f -> %.2f",d,d2));
}
结果是这样的:
24,04 -> 24,05
24,07 -> 24,05
24,02 -> 24,00
24,08 -> 24,10
[编辑] 正如其他人所建议的那样,可能存在一些精度错误。如果您按照我的示例中的建议打印它,它很可能永远不会可见。但这取决于你需要这个号码做什么....