我需要把数字四舍五入到小数点后的两位:
1.1245→1.13 1.1235→1.12
在过去的两天里,我一直在浏览StackOverflow,我一直无法找到任何解决方案,我发现这些解决方案都是有效的:
他们似乎都只是在小数点第三位截断这个数字,然后把它从小数点的四舍五入,这不是我想要做的。我试图从最右边的地方开始,然后适当地开始四舍五入;5-9上升,0-4没有效果,然后被丢弃。
下面是我正在使用的当前代码:
BigDecimal a = new BigDecimal("1.1245");
double b = Math.round(a.doubleValue() * 100) / 100;
System.out.print(a.setScale(2, BigDecimal.ROUND_HALF_EVEN) + " : "
+ a.setScale(2, BigDecimal.ROUND_HALF_UP) + " : "
+ b);下面是控制台的直接输出:

这里的问题是,在所有上述情况下,我都期望1.13是结果,就好像遵循了以下过程:
1.1245 → 1.125 → 1.13
1.1235 → 1.124 → 1.12发布于 2015-01-06 18:43:18
我会用标准的四舍五入来测试距离,然后再调整和旋转:
for (String string : new String[] {"1.1245", "1.1244", "1.1235", "1.1249", "1.1299"}) {
BigDecimal a = new BigDecimal(string);
if (a.setScale(2, BigDecimal.ROUND_HALF_UP).subtract(a).compareTo(new BigDecimal("-0.0044")) < 0) {
System.out.println(string + ":" + a.add(new BigDecimal("0.001")).setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
System.out.println(string + ":" + a.setScale(2, BigDecimal.ROUND_HALF_UP));
}
}结果:
1.1245:1.13
1.1244:1.12
1.1235:1.12
1.1249:1.13
1.1299:1.13发布于 2015-01-06 18:21:09
我认为您应该检查一下您的规格,因为需求是不常见的。总之,我认为这做了你(似乎)需要的事情:
public BigDecimal round(BigDecimal n, int scale) {
if (n.scale() > scale) {
return round(n.setScale(n.scale() - 1, RoundingMode.HALF_UP), scale);
} else {
return n.setScale(scale, RoundingMode.UNNECESSARY);
}
}发布于 2015-01-06 18:14:18
public static double Rnd(double d)
{
d *= 100;
d += .5;
d = (int)d;
d /= 100;
return d;
}这是我学到的最好的四舍五入的方法,因为这两个100度可以调整到不同的地方。
https://stackoverflow.com/questions/27804438
复制相似问题