首页 > 后端开发 > C++ > 为什么 C# 浮点表达式的直接转换和变量赋值会产生不同的整数结果?

为什么 C# 浮点表达式的直接转换和变量赋值会产生不同的整数结果?

Linda Hamilton
发布: 2025-01-08 17:07:43
原创
185 人浏览过

Why Do Direct Casts and Variable Assignments of C# Float Expressions Yield Different Integer Results?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板