我需要将数字舍入到小数点后两位:
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
答案 0 :(得分:1)
我认为你应该仔细检查你的规格,因为这个要求并不常见。无论如何,我认为这样做(你似乎)需要:
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);
}
}
答案 1 :(得分:1)
我会用标准的舍入来测试距离,然后再次调整和舍入:
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
答案 2 :(得分:-1)
public static double Rnd(double d)
{
d *= 100;
d += .5;
d = (int)d;
d /= 100;
return d;
}
这是我学习四舍五入的最好方法,因为两个100可以调整为四舍五入到不同的地方