问题描述
floata=2.5123f;floatb=3.14159f;doubleresult=a*b;Console.WriteLine(result);上面这段代码会将a和b的值相乘的结果转换为double。而下面这段则不同。inta=2147483647;intb=200;longresult=a+b;Console.WriteLine(result);上面这段代码输出的结果是-2147483449。它没有将结果自动转换为long为什么是这样子呢?为什么?为什么呀....真BT
解决方案
解决方案二:
有这样的事??
解决方案三:
我试了试真的是这样关注!
解决方案四:
int最大就是2147483647你再加200当然会这样了
解决方案五:
int的取值范围是-2147483648~2147483648也就是从-2的11次方到+2的11次方因为你的算式是先计算,再赋值的,也就是在赋值前,结果已经越界了,将越界的结果传过去当然不对了.
解决方案六:
inta=2147483647;intb=200;longresult=a+b;等于inta=-2147483648;intb=199;longresult=a+b;
解决方案七:
可是浮点不同,他记录的是点的位数,也就是说在做越界计算的时候,位数也记录了下来,传值的时候一般不会有太大的错位但是不敢保证结果的正确,你可以用双浮点验算一下.
解决方案八:
lz太强了,这都发现了,更好的测试是:floata=float.MaxValue;floatb=float.MaxValue;doubleresult=a*b;结果是:result==(double)a*(double)b
解决方案九:
真BC啊,真BC
解决方案十:
//LZ的式子可以换个方式写inta=2147483647;intb=200;intc=a+b;//此时C已经是-2147483449longresult=c;//结果当然是-2147483449
解决方案十一:
@icdbow,请做下面的测试:floata=float.MaxValue;floatb=float.MaxValue;floatc=a*b;doubleresult=a*b;
结果是c!=result
解决方案十二:
vb.net测试结果相同,IL级别的代码似乎也是正确的,是否应该改口说是clr真BT。。。
解决方案十三:
TO:VWXYZH很长时间没有做这些数的运算了,以前好象有这样的事情,float的和float乘返回的是双浮点.印象不深,您可以用传参的形式测试下.
解决方案十四:
把乘法改成加法,结果也一样c都是Infinity而result都是正确的值
解决方案十五:
数据类型精度问题吧
解决方案:
浮点默认double,整形默认int,我认为很合理~
解决方案:
呵呵,float是先转double再做运算。int是先做运算再转成long的。有意思,不知道是什么道理。
解决方案:
inta=2147483647;intb=200;longresult=(long)a+b;
呵呵,无论设计合不合理,测试的结果就是如此设计不合理又咋了?难道能买下.NET重新开发一次不成?所以改变不了.NET的内核,只能改变自己的代码
解决方案:
本来就是如此,楼主没有认真看帮助罢了。浮点数会转换成double来进行运算,如果int也这样,估计楼主早就发疯了,这会造成我们熟知的1+3这样的式子的结果是long,换言之inti=1+3;会报编译错误,所以显然不可能这样进行运算。但浮点数为什么又要转为double来运算呢?个人认为有两个原因:一是微软在设计C#的时候,有意加入了一些傻瓜元素,放低C#的门槛,例如decimal类型。转换为double计算,可以提高运算精度,避免某些傻瓜程序员问东问西。二是微软在设计IL的时候,明显偏重于整形运算,在IL中整形运算的指令比浮点类型运算的指令多出N倍,更多的运算指令能让CLR更好的根据实际情况选择更好的优化JIT编译结果,不过这也与CPU指令集偏重整形运算一致。这就导致IL中根本没有两个float类型运算的指令,但有两个int类型运算的指令。为了与IL一致,C#便如此设计了。
解决方案:
楼上的回复太强了...
解决方案:
楼上的回复太弱了...
解决方案:
顶一下!!!!!!!!
解决方案:
inta=2147483647;intb=200;longresult=(long)a+(long)b;Console.WriteLine(result);楼主运行一下看看,你就知道为什么了~~~
解决方案:
lz是新手吧那你试试其它语言吧
解决方案:
貌似在某些CPU上。。。。int和long的取值范围是相同的=。=!!传闻而已。。。
解决方案:
ggs,ddu.
解决方案:
哎!!!!!!!!!1
解决方案:
很明显是溢出了吗
解决方案:
在CPU上int和long的取值范围是不相同的;但是double和float却是相同的,都是double的取值范围
解决方案:
个人认为是MS考虑比较周到点,怕我们在进行float运算时溢出