Java double和bigdecimal同样奇怪的值

时间:2013-01-26 04:11:19

标签: java

我正在制作一个关于接受doubleBigDecimal的计算模块,但我有这个问题。

double x = 2.3333333333312398;
BigDecimal big = BigDecimal.valueOf(2.3333333333312398);

我打印他们的值

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

和输出

2.3333333333312396
2.3333333333312396

我尝试将xbig变量的值更改为2.3333333333312395 但输出仍然相同。我再次将其更改为2.3333333333312396并打印相同的值。

如果我再次更改为2.3333333333312394,则会再次显示奇怪的值

2.3333333333312396

这个问题的原因是什么?谢谢!

2 个答案:

答案 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,如果你用字符串文字中的那个值构造它。