我有一些简单的代码可以四舍五入,但是却产生了一些意想不到的结果。

    public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub

    double a = 46.66;
    System.out.println("Roundup: " + roundUp(a,2) + "\nRound Down: " + roundDown(a,2));

}

public static double roundUp(double a, int scale)
{
    BigDecimal value = new BigDecimal(a);
    value = value.setScale(scale, RoundingMode.UP);
    return value.doubleValue();
}

public static double roundDown(double a, int scale)
{
    BigDecimal value = new BigDecimal(a);
    value = value.setScale(scale, RoundingMode.DOWN);
    return value.doubleValue();
}


当我在小数点后使用3位数字时,它按预期方式工作。如果a = 44.661,则输出如下所示。

综述:46.67综述:46.66

当a = 44.66时,舍入值减小1,这是意外的,如下所示。

综述:46.66综述:46.65

我如何获得四舍五入的44.66和四舍五入的44.67,同时仍保留上述结果。

在此先感谢您的帮助

最佳答案

那是因为您并没有真正使用BigDecimals,而是使用了double。当您键入44.66时,它将转换为双精度值,这将导致其值略小于44.66。 BigDecimal无法解决在输入输入之前已经发生的舍入错误。

试试这个吧。

public static void main(String[] args) throws Exception {
    BigDecimal a = new BigDecimal("46.66");
    System.out.println("Roundup: " + roundUp(a,2) + "\nRound Down: " + roundDown(a,2));
}

public static BigDecimal roundUp(BigDecimal a, int scale)
{
    return a.setScale(scale, RoundingMode.UP);
}

public static BigDecimal roundDown(BigDecimal a, int scale)
{
    return a.setScale(scale, RoundingMode.DOWN);
}

关于java - Java BigDecimal向下舍入问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12010449/

10-12 04:23