C# 乗算における浮動小数点精度の問題
C# コード スニペットを調べてみましょう:
<code class="language-csharp">double i = 10 * 0.69;</code>
i
は 6.9 であると予想されますが、多くの場合、実際の出力は 6.8999999999999995 になります。この不一致は、.NET Framework 内の浮動小数点演算の固有の制限から生じます。
浮動小数点数は、10 進数とは異なり、バイナリ形式を使用して表現されます。 この 2 進表現は、0.69 のような無限に繰り返される小数部分を含む特定の 10 進数値を完全には表現できないことを意味します。代わりに、それらは近似されます。
コンパイラは、この制限を認識しているため、実行時に 10 * 0.69
を計算するのではなく、6.9 の近似値を直接保存することで計算を最適化することがよくあります。 この近似は、観察されたわずかな違いを説明します。
特に金融アプリケーションで精度を高めるには、decimal
データ型の使用を検討してください。 decimal
は基数 10 の表現を採用しており、0.69 などの 10 進数をより正確に表現できるため、2 進浮動小数点演算に伴う丸め誤差が最小限に抑えられます。
以上がC# では 10 * 0.69 が正確に 6.9 ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。