C# 浮動小数点式: 浮動小数点から整数への変換で予期しない動作が発生する
C# では、浮動小数点式の結果を整数にキャストするときに予期しない動作が発生することがあります。次のコードを考えてみましょう:
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
直感的には、speed1 とspeed2 には同じ値が含まれるはずです。ただし、実際の結果は次のようになります:
<code>speed1 = 61 speed2 = 62</code>
この異常は、実行される操作の順序から発生します。 Speed1 では、乗算の結果 (6.2f * 10) がすぐに整数に変換され、切り捨てられた値は 61 になります。
対照的に、speed2 では、乗算結果が浮動小数点数として tmp に割り当てられ、浮動小数点への暗黙的な変換中に丸めがトリガーされます。この丸められた値 62 は整数に変換され、正しい結果が得られます。
この動作を理解するには、浮動小数点数 (6.2f など) が正確な数学的値ではなく、近似値であることを理解することが重要です。したがって、浮動小数点数の算術演算では、丸めにより精度が失われる可能性があります。
(int)(6.2f 10) の場合、コンパイラーは、結果が形式的には浮動小数点数であっても、(オプションで) 6.2f 10 の精度を保持することがあります。これにより、より正確な結果が得られます。ただし、この最適化が実装されていない場合、式は倍精度浮動小数点数にキャストされ、精度が失われる可能性があります。
対照的に、 tmp = 6.2f * 10 への代入では、整数変換の前に明示的に丸めが強制されます。これにより、異なるシステム間でも一貫した結果が保証されます。
したがって、このような例外を回避するには、浮動小数点数を整数に変換するときに、Math.Round などの明示的な丸め関数を使用することが一般的に推奨されます。
以上がC# Float 式を Int にキャストすると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。