C# 浮動小数点から整数への変換の異常な動作: 直接変換と変数代入の違い
C# では、浮動小数点式の結果を整数に変換するときに開発者が奇妙な動作に遭遇することがよくあります。たとえば、次のコード スニペットを考えてみましょう:
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
直感的には、speed1 とspeed2 は同じ値になるはずです。ただし、これは当てはまりません。speed1 は 61 に等しく、speed2 は 62 に等しくなります。
相違点の説明
根本的な原因は、直接変換と変数代入の微妙な違いにあります。 Speed1 の場合、式 6.2f * 10 の結果は浮動小数点値 61.999998 になります。暗黙的に整数に変換されると、この値は 61 に切り捨てられます。
一方、変数 tmp には、浮動小数点値 61.999998 が明示的に格納されます。明示的に整数に変換すると、この値は最も近い整数に丸められ、結果は 62 になります。
中精度
この違いは、コンパイラーによって生成されたバイトコードを分析するとさらに興味深いものになります。最初のケースでは、式 6.2f * 10 がそのまま中間値になります。 2 番目のケースでは、コンパイラは結果を浮動小数点変数に格納し、中間ステップを作成します。
中間ストレージのこの違いは、最終結果の精度に影響します。コンパイラは、形式型 (float) がそうでないことを暗示している場合でも、より高精度の中間値の使用を許可します。コンパイラーがこれを行う場合、結果が 61 に切り捨てられ、観察される違いが生じる可能性があります。
この問題を回避する方法
このような場合に一貫性を確保するには、次の例のように、整数に変換する前に浮動小数点式を明示的に丸めることをお勧めします。
以上がC# Float 式のダイレクト キャストと変数代入で異なる整数の結果が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。