dar*_*hna 5 java bigdecimal double-precision
何时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);
Run Code Online (Sandbox Code Playgroud)
x输出为
0.222222221777777790569747304508155316795087227497352441864147715340493949298661391367204487323760986328125
Run Code Online (Sandbox Code Playgroud)
而你是
0.222222221777777778
Run Code Online (Sandbox Code Playgroud)
我错误地说这是因为双重不精确?但既然这是一个BigDecimal,不应该是一样的吗?
das*_*ght 12
我错误地说这是因为双重不精确?
你是绝对正确的,这正是因为double不精确.
但既然这是一个
BigDecimal,不应该是一样的吗?
不,它不应该.您创建的那一刻会引入错误new BigDecimal(0.333333333),因为0.333333333常量已经嵌入了错误.那时你没有办法解决这个表征错误:到那时众所周知的马已经离开了谷仓,所以关门时已经太晚了.
String另一方面,当您传递a时,十进制表示与字符串完全匹配,因此您得到的结果不同.
是的,这是浮点错误.问题是,在文字0.333333333和0.666666666表示为作为参数传递之前双打BigDecimal---值得注意的是,BigDecimal"构造函数将可double作为参数.
标准支持这一点,double除非另有说明,否则浮点文字默认为默认值.
Java 文档有其答案。根据BigDecimal(double val)的Java文档
此构造函数的结果可能有些不可预测。人们可能会认为在 Java 中编写 new BigDecimal(0.1) 会创建一个恰好等于 0.1(未缩放的值 1,小数位数为 1)的 BigDecimal,但它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法精确表示为 double。
| 归档时间: |
|
| 查看次数: |
3872 次 |
| 最近记录: |