Java 中的数字四舍五入到小数点后两位

Rounding numbers to two decimal places in Java

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

1.1245 → 1.13 1.1235 → 1.12

过去两天我一直在搜索 Whosebug,但我一直无法找到任何我发现有效的解决方案:

他们似乎都只是简单地截断小数点后第三位的数字,然后从那里四舍五入,这不是我想要做的。我试图从最右边的地方开始,然后开始适当地四舍五入; 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
public static double Rnd(double d)
{
    d *= 100;
    d += .5;
    d = (int)d;
    d /= 100;
    return d;
}

这是我学到的最好的四舍五入方法,因为两个100可以调整到不同的地方

我认为您应该仔细检查您的规范,因为这种要求并不常见。无论如何,我认为这可以满足您(似乎)的需要:

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

我会用标准四舍五入测试距离,然后再次调整和四舍五入:

    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