我正在制作一个关于接受double
或BigDecimal
的计算模块,但我有这个问题。
double x = 2.3333333333312398;
BigDecimal big = BigDecimal.valueOf(2.3333333333312398);
我打印他们的值
System.out.println(x);
System.out.println(big);
和输出
2.3333333333312396
2.3333333333312396
我尝试将x
和big
变量的值更改为2.3333333333312395
但输出仍然相同。我再次将其更改为2.3333333333312396
并打印相同的值。
如果我再次更改为2.3333333333312394
,则会再次显示奇怪的值
2.3333333333312396
这个问题的原因是什么?谢谢!
答案 0 :(得分:4)
由于您使用双字面值初始化BigDecimal,因此您的准确度已经达到了双倍的限制。相反,请考虑使用String文字初始化BigDecimal,而不是双字面值:
public static void main(String[] args) {
double x = 2.3333333333312398;
BigDecimal big = BigDecimal.valueOf(2.3333333333312398);
BigDecimal big2 = new BigDecimal("2.3333333333312398");
System.out.println(x);
System.out.println(big);
System.out.println(big2);
}
返回:
2.3333333333312396
2.3333333333312396
2.3333333333312398
答案 1 :(得分:2)
double x = 2.3333333333312398;
问题出在这里。双打精度没有17位十进制数,实际上只有15.9左右。在BigDecimal.valueOf()中使用该常量时也是如此。实际上它已经被编译器截断了。你根本不能得到你想要的结果,但是你可以使用BigDecimal,如果你用字符串文字中的那个值构造它。