C# 浮動小数点数から整数への変換の異常な動作
次のコード スニペットは、C# での浮動小数点から整数への変換の予期しない動作を示しています。
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
驚くべきことに、speed1
の値は 61 ですが、speed2
の値は 62 ですが、どちらも結果は 62 であると予想されています。詳しく調べると、speed1
では、浮動小数点式 6.2f * 10
が整数に切り捨てられる前に暗黙的に型 double
に変換され、結果が 61 になることがわかります。
ただし、speed2
では、6.2f * 10
の結果が float
変数 tmp
に明示的に代入されます。この中間ステップでは、値を最も近い float
値 (62) に丸めて、それを整数に変換します。
2 つの操作の主な違いは、中間表現です。最初のケースでは、コンパイラが浮動小数点式に対して高精度の表現を予約することを選択する可能性があり、これにより切り捨てが発生し、値 61 が生成されます。ただし、2 番目のケースでは、明示的な float
代入により丸めが強制され、値は 62 になります。
次のアクション内:
<code class="language-csharp">double d = 6.2f * 10; int tmp2 = (int)d;</code>
d
は double
型になるため、double
が変換され、丸められた値が整数に切り捨てられ、通常は値 62 になります。
浮動小数点式の変換における予期しない動作は、C# の浮動小数点処理の微妙な側面です。予期しない結果を回避し、数値型間の正確な変換を保証するには、このニュアンスを理解することが重要です。
以上がC# で Float 式を整数にキャストすると、メソッドに応じて異なる結果が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。