日期:2014-05-18  浏览次数:20793 次

老鸟进来分析下,菜鸟进来学习下
int i = (int)(float.Parse("0.005")*1000)
这个i的值是多少?
别放代码里去试,凭直觉直接说出来

------解决方案--------------------
4或者5
------解决方案--------------------
5吗?
------解决方案--------------------
浮点运算是会有精度问题的。而转换int的时候,会忽略精度。所以有可能会使结果小于预期值
------解决方案--------------------
这样应该是正确的
C# code
int i = int.Parse((float.Parse("0.005") * 1000).ToString());

------解决方案--------------------
探讨
int i = int.Parse(float.Parse("0.005")*1000).ToString())
int i = (int)(decimal.Parse("0.005")*1000)
上面一个错了, 这两个分别是多少?

------解决方案--------------------
肯定是5...
------解决方案--------------------
晕 试了下 是5...
------解决方案--------------------
是4...
------解决方案--------------------
5可能性比较大

反过来想也有可能为0
------解决方案--------------------
你猜这个的结果是啥?
C# code
(0.005f * 1000)-5f

------解决方案--------------------
想了一定是5

不可能是0看错精度
------解决方案--------------------
第一个(int)(float.Parse("0.005")*1000)
其中首先内存里先生成0.005的2进制32代码,然后再做乘法运算,因为0.005的2进制运算是无限的。所以在运算过肯定有进位,那么肯定是数据丢失,可以肯定的是运算过后的5是一个接近与5的近视数字,实际上应该是4.9999。。。 那么这时候做int转化的时候就是4了
------解决方案--------------------
应该是5
------解决方案--------------------
18楼分析的很牛逼,学习了
------解决方案--------------------
有可能4
------解决方案--------------------
探讨
第一个(int)(float.Parse("0.005")*1000)
其中首先内存里先生成0.005的2进制32代码,然后再做乘法运算,因为0.005的2进制运算是无限的。所以在运算过肯定有进位,那么肯定是数据丢失,可以肯定的是运算过后的5是一个接近与5的近视数字,实际上应该是4.9999。。。 那么这时候做int转化的时候就是4了

------解决方案--------------------
0.005的二进制是1.010001111010111000010100100011110101...E-8

float能表示的有效二进制为只有23位,所以红色的部分舍掉了。所以实际内存中的数比0.005小,是
0.00499999988824129
------解决方案--------------------
脑筋急转弯

------解决方案--------------------
是5啊。代码测试过了。
------解决方案--------------------
当然是5了
------解决方案--------------------
lz帮你加到100分了,你懂得