2

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

    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 向上舍入。

在此先感谢您的帮助

4

3 回答 3

9

那是因为您并没有真正使用 BigDecimals,而是使用双打。当您键入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);
}
于 2012-08-17T17:37:31.810 回答
2

您可以做的是使用 BigDecimal.valueOf 向上或向下舍入

 BigDecimal value = BigDecimal.valueOf(a);

这可以补偿双精度数的表示误差,但是如果您也有一些算术舍入误差,这可能还不够。

相反,您需要确定最大的舍入误差是多少

public static double roundUp2(double d) {
    return Math.ceil(d * 100 - ERR)/100.0;
}

public static double roundHalf2(double d) {
    return Math.ceil(d * 100)/100.0;
}

public static double roundDown2(double d) {
    return Math.floor(d * 100 + ERR)/100.0;
}
于 2012-08-17T19:54:13.277 回答
0

我相信您真正需要的是执行以下功能:

private static void roundUp(double num, int decimalPlaces){

for (int i =0; i< decimalPlaces; ++i){
     num*=10; 
}

int tmp = (int) (num+0.5);
num = tmp;

for (int i =0; i< decimalPlaces; ++i){
     num = num/10; 
}
}

并且您可以使用替代方法进行四舍五入,只需将“num+0.5”更改为“num - 0.5”。但是,由于机器浮点数错误,这可能会在打印时造成麻烦。但是你也可以为此做点什么。

于 2012-08-17T17:45:59.183 回答