我有一组像这样的NSTimeIntervals:
NSArray *mySet = [NSArray arrayWithObjects:
[NSNumber numberWithDouble: time1], //
[NSNumber numberWithDouble: time2],
[NSNumber numberWithDouble: time3],
nil];
// suppose that at this time
// time1 = 0.00000
// time2 = 18.3200
// time3 = 21.6500
在我的代码中的某个时刻我想测试currentTime是否大于或等于阵列上的一个时间,所以我做
// currentTime = 18.32 right now
for (int i=0; i<[mySet count]; i++) {
if (currentTime >= [[mySet objectAtIndex:i] doubleValue]) {
NSLog(@"%d...", i);
}
}
输出应该是“1 ...... 2 ......” 但输出只是“1 ......”
当 i = 1 时, 它是在比较18.32到18.32并且没有认识到该值等于或大于另一个? WTF ???
怎么可能?
感谢您的帮助。
答案 0 :(得分:5)
通常在比较浮点值时,您需要确定一个浮点值与另一个( epsilon 或错误界限)之间的距离,然后检查它们是否在其中。最简单的方法是从另一个中减去一个,然后检查结果的绝对值是否小于或等于 epsilon 。
伪代码:
var values = [...];
var toCheck = ...;
var epsilon = 0.00001;
for (var i = 0; i < length(values); ++i)
if (abs(values[i] - toCheck) <= epsilon)
print "they are close enough"
end
end
答案 1 :(得分:2)
如果您正在尝试进行精确计算,则不应使用NSNumber,而应使用NSDecimalNumber。前者只是用于将数字存储为对象的包装器,而第二个用于在进行计算时保持精度。它比极端范围内的标量效果更好。
答案 2 :(得分:0)
除某些情况外,您无法比较双重值的相等性。 (1.00000 == 1.0000)可能会成立,但(1.3000 == 1.3000)很可能不会。这是因为双打实际上不是十进制数;并非所有数字都可以用双数表示;你的价值可能是18.320000123和18.320000473;也就是说;可能有很多尾随垃圾对你所选择的精度无趣,但不能让它们比较平等。
通过NSNumber运行其中一个没有帮助;两次。
答案 3 :(得分:0)
您将var i声明为int,然后尝试将其作为double值进行nslog而不进行强制转换。日志可能会失败,与测试的精度无关。