首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal精度问题

Java BigDecimal精度问题
EN

Stack Overflow用户
提问于 2012-03-21 05:36:30
回答 5查看 25.6K关注 0票数 15
代码语言:javascript
复制
System.out.println(0.1 + 0.1 + 0.1);    

或者即使我使用BigDecimal

代码语言:javascript
复制
System.out.println(new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue());

我该如何解决这个问题呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-21 06:07:17

你真正想要的是

代码语言:javascript
复制
new BigDecimal("0.1")
 .add(new BigDecimal("0.1"))
 .add(new BigDecimal("0.1"));

new BigDecimal(double)构造函数获得了double的所有不精确度,所以当您说0.1时,您已经引入了舍入误差。使用String构造函数可以避免与通过double进行操作相关的舍入错误。

票数 31
EN

Stack Overflow用户

发布于 2012-03-21 07:39:13

First never ,千万不要使用BigDecimal的双构造函数。这在某些情况下可能是正确的,但大多数情况下不是。

如果可以控制输入,请使用前面提出的BigDecimal字符串构造函数。这样你就能得到你想要的东西。如果您已经有了double (毕竟可能会发生),那么不要使用double构造函数,而要使用静态valueOf方法。这有一个很好的优势,那就是我们得到了double的规范表示,这至少减轻了问题。而且结果通常更直观。

票数 9
EN

Stack Overflow用户

发布于 2012-03-21 05:45:54

这不是Java的问题,而是一般计算机的问题。核心问题在于从十进制格式(人的格式)到二进制格式(计算机格式)的转换。有些十进制格式的数字在没有无限重复小数的情况下不能用二进制格式表示。

例如,0.01001100小数点等于0.01001100...但是一台计算机有一个有限的“槽”(位)来保存一个数字,所以它不能保存整个无穷大的表示。例如,它只节省了0.01001100110011001100。但以十进制表示的数字不再是0.3,而是0.30000000000000004。

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

https://stackoverflow.com/questions/9795364

复制
相关文章

相似问题

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