1

我有以下用于在 Java 中舍入双精度值的函数:

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 具有这种行为,但没有成功。

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

4

2 回答 2

11

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

它遵守记录在案的行为:)来自文档

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

对于RoundingMode.HALF_UP

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

现在 7.3149999999999995与 7.31 和 7.32 的距离并不相等 - 它更接近 7.31,所以这就是结果。

只有当原始值恰好是 7.315(即两者之间的一半)时,才能看到HALF_UP和之间的差异。HALF_DOWN

顺便说一句,为了确保你得到你期望开始的数字,我建议使用String. 例如:

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

不一样:

BigDecimal bd = new BigDecimal("0.1");

doubleto转换通常BigDecimal表明您有问题,并且您应该始终使用一种类型。

于 2012-09-28T17:39:53.757 回答
1

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

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

查看不同的舍入模式以提供您想要的行为。

于 2012-09-28T17:40:21.720 回答