.NET の倍精度乗算精度問題の詳細説明
C# では、式 double i = 10 * 0.69;
の結果として、i
には予想される 6.9 ではなく 6.89999999999999995 という値が割り当てられます。ここで、.NET の倍精度乗算に何か問題があるのでしょうか?という疑問が生じます。
バイナリ表現と浮動小数点演算
この動作を理解するには、バイナリ表現と浮動小数点演算の微妙さを深く理解する必要があります。浮動小数点形式は、実数を有限のバイナリ値として近似的に表すため、精度に制限が生じる可能性があります。
一見単純な 0.69 は 2 進数で正確に表現できません。これには、2 進数の無限ループシーケンスが必要です。 double
データ型に格納されるバイナリ表現は、0.69 の近似値です。
コンパイラの最適化と格納された定数
提供されたコード スニペットでは、コンパイラーは乗算を実行し、結果を定数として実行可能ファイルに保存することで式を最適化します。これは、値がコンパイル時にわかっているためです。保存される値は浮動小数点近似値 6.9 であり、実際の値よりわずかに小さくなります。
回避策と代替データ型
この問題を解決し、より正確な結果を取得するには、decimal
データ型を使用できます。このデータ型は、非反復 10 進数値をより高精度で表すように設計されています。 decimal i = 10m * 0.69m;
という式は 6.9m になります。
以上が.NET では二重乗算が機能しませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。