十个0.1浮点数之和不等于1

时间:2016-07-07 17:00:16

标签: objective-c math floating-point

我在循环中添加了一些float个。 我预计当i达到9时,总和将等于1,并且NSLog(@"EXTRA: %f", sum);将被执行。它永远不会被执行......这里发生了什么?

这是我的代码:

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);
}

1 个答案:

答案 0 :(得分:3)

1/10的二进制值类似于1/3的Denary值 - 它重复出现。实际上,存储在变量中的1/10值为0.0001100110011001100110011...

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

因此,当我向0.000110011添加0.000110011时,我得到的0.001100110不是2/10,与0.333333 + 0.333333 =相同! 2/3 - 它等于0.66666

这种情况发生了9次,因此二进制中的1/10 * 10不等于1,它是0.111111111,等于0.998046875 - 离1很远。

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