.NETの二重精度の乗算精度問題の詳細な説明
In C#, the result of the expression double i = 10 * 0.69;
is that i
is assigned a value of 6.8999999999999999999999999999999999995, rather than the expected 6.9.これは疑問を提起します:.NETの二重精度の乗算にエラーはありますか?
バイナリ表現とフローティングポイント操作
]この動作を理解するには、バイナリ表現と浮動小数点操作の微妙さを深く理解する必要があります。浮動小数点形式は、実数を有限のバイナリ値として表し、精密な制限につながる可能性があります。
一見単純な0.69は、バイナリで正確に表現することはできません。バイナリ数の無限ループが必要です。 double
データ型に保存されているバイナリ表現は、0.69のおおよその値です。
定数コンパイラによって最適化および保存された
]提供されたコードスニペットでは、コンパイラは乗算を実行し、結果を実行可能ファイルに定数として保存することにより式を最適化します。これらの値はコンパイル時に知られているため、これを行います。保存された値は6.9の浮動小数点近似であり、実際の値よりもわずかに小さくなります。
ソリューションと代替データ型
]この問題を解決し、より正確な結果を得るために、 10進数
データ型を使用できます。式 10進数= 10m * 0.69m;
は69mの結果を生成します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3