我正在尝试测试一个数字是否可以被另一个整除(无余数)。如果将它与int进行比较,则可以正常工作:
NSTimeInterval timeElapsed = // a double goes here
// round to 3 decimal points to avoid floating point weirdness
timeElapsed = [[NSString stringWithFormat:@"%.3f",timeElapsed] doubleValue];
接着
// This works correctly
if (fmod(timeElapsed, 1) == 0) {
NSLog(@"is divisible");
}
但是,如果我将其与小数进行比较,它将失败,只会间歇触发:
// This does NOT work correctly
if (fmod(timeElapsed, .1) == 0) {
NSLog(@"is divisible");
}
我究竟做错了什么?
编辑:在阅读了下面的答案和好评后,我得出的结论是,整个方法是一个坏主意。没有保证能够生成特定的时间间隔。最好是创建单独的计时器,而不是侦听一个“主”计时器。
最佳答案
通常,浮点数不能精确表示,因为您只能用有限的位数来表示它们(通常为32或64)。因此,您绝不应该测试是否完全相等,而应测试到可以接受的较小公差范围内,例如
if (fabs(fmod(timeElapsed, .1)) < SOME_SMALL_VALUE) {
NSLog(@"is divisible");
}
如果您要编写任何严肃的数字代码,则最好阅读Goldberg paper on floating point arithmetic。