当BigDecimal与double的输入一起使用,BigDecimal与String的输入一起使用时,似乎出现了不同的结果。
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项产出
0.222222221777777790569747304508155316795087227497352441864147715340493949298661391367204487323760986328125而y是
0.222222221777777778我说这是因为双重不精确,我说错了吗?但是既然这是一个BigDecimal,难道不应该是一样的吗?
发布于 2015-04-14 16:23:15
我说这是因为双重不精确,我说错了吗?
你说得对,这完全是因为double的不精确。
但是既然这是一个
BigDecimal,难道不应该是一样的吗?
不,不应该。创建new BigDecimal(0.333333333)时就会出现错误,因为0.333333333常量中已经嵌入了一个错误。在这一点上,你无法修复这个表示错误:俗话说的马已经离开谷仓了,所以现在关门已经太晚了。
另一方面,当您传递一个String时,十进制表示与字符串完全匹配,因此得到了不同的结果。
发布于 2015-04-14 16:23:04
是的,这是浮点错误。问题是,文字0.333333333和0.666666666在作为参数传递给BigDecimal之前被表示为双数--特别是,BigDecimal的构造函数以double作为参数。
这得到了标准的支持,标准中说除非另有规定。
发布于 2015-04-14 16:25:40
Java文档有它的答案。根据BigDecimal(双val)的Java文档
此构造函数的结果可能有些不可预测。人们可能会假设用Java编写新的BigDecimal( 0.1 )会创建一个完全等于0.1的BigDecimal (非缩放值为1,刻度为1),但它实际上等于BigDecimal这是因为0.1不能完全表示为双。
https://stackoverflow.com/questions/29632454
复制相似问题