前两天在看PHP的时候看到一本书中提到在由浮点型转换成整形的时候需要注意,因为由于计算机存储的问题会导致某些出人意料的结果。我突然想起来在原来看Java 的时候也有相同的问题,但是以前没有仔细想。既然这里也提到了,就应该好好总结下。以下是我用的例子:
在PHP/Java/C++/C#下我都尝试着运行了下面计算的结果:
(int)(0.1*10) (int)((0.1+0.7)*10) (int)((0.1+0.9)*10)
结果得到的结果都是:1 7 10
对于这个答案我也只能解释第二个的答案,因为在计算机的内部,所有的信息都是以二进制存储的,所以在计算机中不能精确的表示0.1,而只能表示成0.099999....。所以0.1+0.7等于0.799999....,乘以10就是7.999999....,而去整就是截取小数点后的字段,所以得到的答案是7。但是如果以这个理由来解释第一和第三个就又解释不清楚了。
这个问题问了好些人,也没有给出具体的答案。我估计要彻底理解这个问题,需要从计算机的运算原理入手。其实能否正确理解这个问题的原理并不重要,只要我们知道有这种事情,在编程的时候小心些就好了。尽量避免这种运算,就像永远不要比较浮点数是否相等的道理一样。