2016-07-07 38 views
-3

我在一个循环中加入了一些float s。 我预计当i达到9时,总和将等于1,并且NSLog(@"EXTRA: %f", sum);将被执行。它从未被执行......这里发生了什么?十个0.1浮点数的总和不等于1

这里是我的代码:

float number = 0.1; 
float sum = 0; 

for (int i = 0; i < 1000; i++) { 
    sum += number; 

    if (sum == 1) { 
     NSLog(@"EXTRA: %f", sum); 
    } 
    NSLog(@"%f", sum); 
} 
+0

尝试0.1 + 0.2,如果你知道二进制,写出二进制0.1。 – Tim

+0

年没有做过任何二进制 – MegaManX

回答

3

1/10二进制值是一样的1/3的Denary价值 - 它reccurs。实际上,存储在变量中的1/10的值是0.0001100110011001100110011...

但是这个数字的长度受限于float长度或32/64位操作系统。

所以,当我添加0.0001100110.000110011我得到0.001100110这是不太2/10,同为0.333333 + 0.333333 =!它等于0.66666

这发生了9次,所以1/10 * 10二进制不等于1,它是0.111111111,它等于0.998046875 - 关闭1很长的路要走。

更多小数位数(例如30)0.000110011001100110011001100110 * 1010 = 0.1111111111111111111111111111000.999999996274709701538085937500。这不完全是1