我在循环中添加了一些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);
}
答案 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.111111111111111111111111111100
或0.999999996274709701538085937500
。这不是1
。