1

我正在制作一个关于接受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

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

4

2 回答 2

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
于 2013-01-26T04:12:50.923 回答
2
double x = 2.3333333333312398;

问题就在这里。双精度数没有 17 位十进制数字,实际上只有 15.9 位左右。当您在 BigDecimal.valueOf() 中使用该常量时,同样适用。事实上,它已经被编译器截断了。您根本无法从 double 中获得所需的结果,但如果您使用字符串文字中的该值构造它,则可以使用 BigDecimal。

于 2013-01-26T04:21:00.167 回答