我有一个关于循环中浮点值增量的查询。

我有以下代码

float add = 1.02f;
float counter = 0.0f;
for (int i = 0; i < 20; i++) {
    counter += add;
    NSLog(@"%f",counter);
}


在执行此循环时,我得到以下结果

1.020000
2.040000
3.060000
4.080000
5.100000
6.120000
7.140000
8.160000
9.180000
10.200001
11.220001
12.240002
13.260002
14.280003
15.300003
16.320004
17.340004
18.360004
19.380005
20.400005


这是预期的结果

1.020000
2.040000
3.060000
4.080000
5.100000
6.120000
7.140000
8.160000
9.180000
10.200000
11.220000
12.240000
13.260000
14.280000
15.300000
16.320000
17.340000
18.360000
19.380000
20.400000


为什么我在不添加循环的情况下得到一些浮点数。

我需要循环超过1000次。我想要float变量中的值。

提前致谢。

最佳答案

发生这种情况是因为float无法精确表示您具有的值。有两种简单的解决方法:


将数字表示为目标值的100倍,并使用整数-1.02变为1022.04变为204,依此类推。
使用NSDecimalNumber代表数字-与float不同,NSDecimalNumber可以完全精确地代表所有值。


这是实现第一种方法的方法:

int add = 102;
int counter = 0;
for (int i = 0; i < 20; i++) {
    counter += add;
    NSLog(@"%d.%d", counter/100, counter%100);
}


这是实现第二种方法的方法:

NSDecimalNumber add = [NSDecimalNumber decimalNumberWithString:@"1.02"];
NSDecimalNumber counter = [NSDecimalNumber zero];
for (int i = 0; i < 20; i++) {
    counter = [counter decimalNumberByAdding:add];
    NSLog(@"%@", counter);
}

10-07 19:56
查看更多