将数字舍入到Java中的两位小数

时间:2015-01-06 18:01:29

标签: java rounding

我需要将数字舍入到小数点后两位:

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);

这是直接来自控制台的输出:

console output

这里的问题是我希望1.13是上述所有情况的结果,就好像遵循以下过程一样:

1.1245 → 1.125 → 1.13
1.1235 → 1.124 → 1.12

3 个答案:

答案 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可以调整为四舍五入到不同的地方