我有以下函数,用于在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会出现这种行为,但是没有成功。

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

最佳答案

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


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


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


对于RoundingMode.HALF_UP


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


现在7.3149999999999995与7.31和7.32距离不相等-它更接近7.31,因此就是结果。

仅当原始值正好是7.315,即介于两者之间的一半时,才能看到HALF_UPHALF_DOWN之间的差异。

顺便说一句,为确保您获得准确的起始编号,我建议使用String。例如:

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


与以下内容不同:

BigDecimal bd = new BigDecimal("0.1");


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

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

10-10 11:08
查看更多