日期:2014-05-17  浏览次数:20975 次

float计算问题
float i1 = 0.1f;
float i2 = 10f;
float i3 = 1.0f;
var i=i3 - i1 * i2;




i 是个-0.0000000149011612
为什么不是0,求大神解释
百度了一下,有人说是二进制转十进制导致的问题
不是很明白,跪求解惑

------解决方案--------------------
简单的说,浮点计算是有误差的。
------解决方案--------------------
这个不是用代码能解决的,你看下来个吧

十进制转二进制
比如 22.8125转二进制 

整数和小数分别转换。整数除以2,商继续除以2,得到0为止,将余数逆序排列。
22 / 2 11 余0
11/2 5 余 1
5 /2 2 余 1
2 /2 1 余 0
1 /2 0 余 1
所以22的二进制是10110

小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。

0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,

结束所以0.8125的二进制是0.1101

十进制22.8125等于二进制10110.1101

二进制转十进制
小数点前 2^0 2^1....2^n
小数点后 2^-1 2^-2 ...2^-n