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 直接成为中间值。在第二种情况下,编译器将结果存储在浮点变量中,创建一个中间步骤。
这种中间存储的差异会影响最终结果的精度。编译器允许使用更高的精度中间值,即使正式类型 (float) 暗示了其他情况。在编译器执行此操作的某些情况下,结果可能会被截断为 61,从而导致观察到的差异。
如何避免此问题
为了确保在这些情况下的一致性,建议在转换为整数之前显式舍入浮点表达式,如下例所示:
<code class="language-csharp">int speed3 = (int)Math.Round(6.2f * 10);</code>
以上是为什么 C# 浮点表达式的直接转换和变量赋值会产生不同的整数结果?的详细内容。更多信息请关注PHP中文网其他相关文章!