首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#浮点表达式:将结果浮点转换为整型时的奇怪行为

C#浮点表达式:将结果浮点转换为整型时的奇怪行为
EN

Stack Overflow用户
提问于 2012-01-18 22:04:01
回答 7查看 19.4K关注 0票数 130

我有以下简单的代码:

代码语言:javascript
复制
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;

speed1speed2应该有相同的值,但实际上,我有:

代码语言:javascript
复制
speed1 = 61
speed2 = 62

我知道我可能应该使用Math.Round而不是强制转换,但我想知道为什么值是不同的。

我查看了生成的字节码,但除了存储和加载之外,操作码都是相同的。

我还在java中尝试了相同的代码,我正确地获得了62和62。

有人能解释一下吗?

编辑:在实际代码中,它不是直接的6.2f * 10,而是一个函数调用*一个常量。我有以下字节码:

对于speed1

代码语言:javascript
复制
IL_01b3:  ldloc.s    V_8
IL_01b5:  callvirt   instance float32 myPackage.MyClass::getSpeed()
IL_01ba:  ldc.r4     10.
IL_01bf:  mul
IL_01c0:  conv.i4
IL_01c1:  stloc.s    V_9

对于speed2

代码语言:javascript
复制
IL_01c3:  ldloc.s    V_8
IL_01c5:  callvirt   instance float32 myPackage.MyClass::getSpeed()
IL_01ca:  ldc.r4     10.
IL_01cf:  mul
IL_01d0:  stloc.s    V_10
IL_01d2:  ldloc.s    V_10
IL_01d4:  conv.i4
IL_01d5:  stloc.s    V_11

我们可以看到,操作数是浮点数,唯一的区别是stloc/ldloc

至于虚拟机,我尝试了Mono/Win7,Mono/MacOS和.NET/Windows,结果相同。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8911440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档