读书人

老鸟进来分析下,初学者进来学习下

发布时间: 2012-03-15 11:50:38 作者: rapoo

老鸟进来分析下,菜鸟进来学习下
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分了,你懂得

读书人网 >C#

热点推荐