浮点运算,分步运算和一步运算结果不一样
程序中发现浮点预算结果和预期不一样,就做了如下代码测试:double f = 1.01;
// 方法一
float a = (float)f * 100
ushort b = (ushort)a;
// 方法二
ushort c = (ushort)((float)f * 100);
一段很简单的代码,但计算的记过是b=101,c=100。
为何出现这种情况?难道一步计算和分步计算有区别吗?试验是在DEBUG下做的,代码应该不存在优化问题。 浮点运算 --------------------编程问答-------------------- 另外,如果f为1.02,结果是b=102,c=101。
感觉是浮点表示方法带来的问题,方法二可能是浮点转换成整数时,将后面的0.9999截断导致。
但不明白
1.为何两种感觉完全一样的算法,结果却不一样?
2.如果存在这种截断问题,浮点转换成整数是不是必须加四舍五入?
--------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/cbf1574z(VS.80).aspx
msdn下就可以知道了 --------------------编程问答-------------------- 楼上的可能没理解我的意思,强制转换没有什么疑惑的,我疑惑的是两种几乎完全一样的计算,为何结果不一样 --------------------编程问答-------------------- 我测试了一下,的确如此,想了想,动手测了一下:
double f = 1.01; //1.01
double double1 = (float)f * 100; //100.99999904632568
float a = (float)f * 100; //101.0
ushort b = (ushort)a; //101
ushort c = (ushort)((float)f * 100); //100
ushort c2 = (ushort)(float)((float)f * 100); //101
后面的是debug的时候得到的数值。也就是说(float)f * 100得到的类型其实是double类型,所以后来(ushort)((float)f * 100)就会把小数略去,而第一种float a = (float)f * 100会强制把double类型转为float类型,导致四舍五入,最终由float转成ushort时,就变成了100。
补充:.NET技术 , C#