首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal舍入误差

Java BigDecimal舍入误差
EN

Stack Overflow用户
提问于 2012-09-29 01:32:53
回答 2查看 1.1K关注 0票数 1

我有以下函数,用于在Java中对双精度值进行舍入:

代码语言:javascript
复制
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();
}

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

代码语言:javascript
复制
double d = 7.3149999999999995;
int decimalPlace = 2

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

有人能解释一下为什么会发生这种情况吗?非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 01:39:54

有人能解释一下为什么会发生这种情况吗?

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

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

而对于RoundingMode.HALF_UP

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

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

只有当原始值恰好为7.315时,才会看到HALF_UPHALF_DOWN之间的差异,即两者之间的一半。

顺便说一句,为了确保你得到的是你想要的数字,我建议你使用String。例如:

代码语言:javascript
复制
double d = 0.1;
BigDecimal bd = new BigDecimal(d);

不同于:

代码语言:javascript
复制
BigDecimal bd = new BigDecimal("0.1");

doubleBigDecimal的转换通常是错误的标志,您应该始终使用一种类型。

票数 11
EN

Stack Overflow用户

发布于 2012-09-29 01:40:22

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12644715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档