Java BigDecimal舍入错误

时间:2012-09-28 17:32:53

标签: java android rounding bigdecimal

我有以下函数用于舍入Java中的double值:

public static double round(double d, int decimalPlace) {

    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
}

作为输入,此函数正在接收以下值:

double d = 7.3149999999999995;
int decimalPlace = 2

但是,当函数返回时,返回的值是7.31,而不是7.32。 我搜索了文档,看看为什么bd.SetScale与这种行为有关,但没有成功。

有人可以解释为什么会这样吗? 非常感谢!!

2 个答案:

答案 0 :(得分:11)

  

有人可以解释为什么会这样吗?

它遵守记录的行为:)来自the docs

  

如果通过操作减小比例,则必须将未缩放的值除以(而不是相乘),并且可以改变该值;在这种情况下,指定的舍入模式将应用于除法。

对于RoundingMode.HALF_UP

  

舍入模式向“最近邻居”舍入,除非两个邻居都是等距的,在这种情况下向上舍入。

现在7.3149999999999995 与7.31和7.32都不等 - 它更接近7.31,所以这就是结果。

HALF_UPHALF_DOWN之间的区别仅在原始值恰好为7.315时才会出现,即两者之间的差异。

顺便说一下,为了确保您完全您希望开始使用的数字,我建议使用String。例如:

double d = 0.1;
BigDecimal bd = new BigDecimal(d);

与:

不同
BigDecimal bd = new BigDecimal("0.1");

double转换为BigDecimal 通常表示您出错了,并且您应始终使用一种类型。

答案 1 :(得分:1)

ROUND_HALF_UP:舍入模式向“最近邻居”舍入,除非两个邻居都是等距的,在这种情况下向上舍入。

在您的示例中,最近的邻居是:7.31,因为7.314中的4更接近0而不是10.要证明这一点,请将7.314 ...更改为7.315 ....

查看不同的舍入模式以提供所需的行为。