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 を double リテラルで初期化しているため、double の精度の限界に達しています。代わりに、double リテラル値ではなく 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 に答える