問題

誰もがなぜ地球上でこれらの「同じ」表現が異なる値を返すのか説明できますか?

 (new BigDecimal(String.valueOf(131.7d))).multiply(new BigDecimal(String.valueOf(0.95d))).doubleValue() = 125.115

(new BigDecimal(               131.7d )).multiply(new BigDecimal(               0.95d )).doubleValue() = 125.11499999999998
 

BigDecimalはそれらの間で何をしていますか?

  ベストアンサー

APIのドキュメントを読むと、 taht String.valueOf(dobule)Double.toString(double)を使用して値をフォーマットします。おそらく明らかではありませんが、Double.toString(double)は文字列としてフォーマットする前に値をラウンドします。

mまたはaの小数部分には何桁の数字を出力する必要がありますか? 小数部分を表す数字は少なくとも1桁でなければなりません。 それを超えていますが、必要な数だけです 型の隣接する値と引数値を一意に区別する double。つまり、xが正確な数学的値であるとします このメソッドによって作成された 10 進表現で表されます。 有限の非ゼロ引数d。次に、dは最も近い二重値でなければなりません x;または2つのdouble値がxに等しく近い場合、dは そのうちの1つとdの最も重要な部分は 0 にします。

この結果、引数の正確な値が131.69999999999886313162783839702606062011785であっても、String.valueOf(131.7d)は文字列 "131.7"を返します。この理由は、10進数分数は常にバイナリ分数を使用して正確に表現することはできません(浮動小数点数と倍数で使用されます)。

したがって、new new BigDecimal(String.valueOf(131.7))は正確な値131.7のBigDecimalを作成します。 new BigDecimal(131.7)は正確な値131.6999999998863131627838397026062011717でBigDecimalを作成します。

  同じタグがついた質問を見る

javaandroidbigdecimalrounding