提问人:dardeshna 提问时间:4/15/2015 最后编辑:dardeshna 更新时间:4/15/2015 访问量:7407
new BigDecimal(double) 与 new BigDecimal(String) [重复]
new BigDecimal(double) vs new BigDecimal(String) [duplicate]
问:
当与输入和输入一起使用时,似乎会出现不同的结果。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
答:
是的,这是浮点误差。问题在于,在作为参数传递给 --- 之前,文字 和 被表示为双精度,值得注意的是,的构造函数将 a 作为参数。0.333333333
0.666666666
BigDecimal
BigDecimal
double
该标准支持这一点,该标准规定,除非另有说明,否则浮点文字默认为 double
。
评论
0.333333333
new BigDecimal("0.333333333")
0.333333333
FileNotFoundError
我说这是因为双重不精确性错了吗?
你说得很对,这恰恰是因为不精确。double
但既然是,就不应该是一样的吗?
BigDecimal
不,它不应该。该错误是在您创建的那一刻引入的,因为 constant 中已经嵌入了一个错误。在这一点上,你无法做任何事情来修复这个表示错误:众所周知的马到那时已经离开了谷仓,所以关门为时已晚。new BigDecimal(0.333333333)
0.333333333
另一方面,当您传递 时,十进制表示形式与字符串完全匹配,因此您会得到不同的结果。String
当您以任何方式定义双精度变量时,在大多数情况下,它不会是您定义的值,而是最接近的二进制表示形式。您正在向构造函数传递双精度值,因此已经提供了小的不精确性。
Java 文档有它的答案。根据 BigDecimal 的 Java 文档(double val)
此构造函数的结果可能有些不可预测。一 可能会假设在 Java 中编写新的 BigDecimal(0.1) 会创建一个 BigDecimal 正好等于 0.1(未缩放的值为 1,带有 1 的刻度),但实际上等于 0.1000000000000000055511151231257827021181583404541015625。 这是因为 0.1 不能完全表示为双精度。
下一个:将文本或字符串更改为弧形
评论
double
.setScale(10, BigDecimal.ROUND_HALF_UP);