首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新BigDecimal(双)与新BigDecimal(字符串)

新BigDecimal(双)与新BigDecimal(字符串)
EN

Stack Overflow用户
提问于 2015-04-14 16:19:04
回答 4查看 6.5K关注 0票数 7

BigDecimaldouble的输入一起使用,BigDecimalString的输入一起使用时,似乎出现了不同的结果。

代码语言:javascript
复制
BigDecimal a = new BigDecimal(0.333333333);
BigDecimal b = new BigDecimal(0.666666666);

BigDecimal c = new BigDecimal("0.333333333");
BigDecimal d = new BigDecimal("0.666666666");

BigDecimal x = a.multiply(b);
BigDecimal y = c.multiply(d);

System.out.println(x);
System.out.println(y);

X项产出

代码语言:javascript
复制
0.222222221777777790569747304508155316795087227497352441864147715340493949298661391367204487323760986328125

而y是

代码语言:javascript
复制
0.222222221777777778

我说这是因为双重不精确,我说错了吗?但是既然这是一个BigDecimal,难道不应该是一样的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-14 16:23:15

我说这是因为双重不精确,我说错了吗?

你说得对,这完全是因为double的不精确。

但是既然这是一个BigDecimal,难道不应该是一样的吗?

不,不应该。创建new BigDecimal(0.333333333)时就会出现错误,因为0.333333333常量中已经嵌入了一个错误。在这一点上,你无法修复这个表示错误:俗话说的马已经离开谷仓了,所以现在关门已经太晚了。

另一方面,当您传递一个String时,十进制表示与字符串完全匹配,因此得到了不同的结果。

票数 13
EN

Stack Overflow用户

发布于 2015-04-14 16:23:04

是的,这是浮点错误。问题是,文字0.3333333330.666666666在作为参数传递给BigDecimal之前被表示为双数--特别是,BigDecimal的构造函数以double作为参数。

这得到了标准的支持,标准中说除非另有规定

票数 6
EN

Stack Overflow用户

发布于 2015-04-14 16:25:40

Java文档有它的答案。根据BigDecimal(双val)的Java文档

此构造函数的结果可能有些不可预测。人们可能会假设用Java编写新的BigDecimal( 0.1 )会创建一个完全等于0.1的BigDecimal (非缩放值为1,刻度为1),但它实际上等于BigDecimal这是因为0.1不能完全表示为双。

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

https://stackoverflow.com/questions/29632454

复制
相关文章

相似问题

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