例如,对于原语,我会这样做
if ( (x >= 6000) && (x <= 20000) )
// do something here
对于 NSDecimalNumber,这就是我所拥有的
if ( (([x compare:[NSNumber numberWithInt:6000]] == NSOrderedSame) ||
([x compare:[NSNumber numberWithInt:6000]] == NSOrderedDescending))
&& (([x compare:[NSNumber numberWithInt:20000]] == NSOrderedSame) ||
([x compare:[NSNumber numberWithInt:6000]] == NSOrderedAscending)) )
{
// do something here
}
有没有其他方法(更简单和更优雅)来进行这种比较?如果我将值转换为原始值,我使用什么原始值?我不想使用 CGFloat、float 或 double,因为我在这里处理货币。或者,如果我确实将它们转换为上述那些,有人可以验证/解释精度吗?
最佳答案
我的理解是,您只能使用 compare:
方法比较 NSDecimalNumber
和 NSNumber
对象。 super 令人沮丧,但我相信这是因为 Objective-C 不支持运算符重载。
如果它变得真的难以阅读,您总是可以添加一个带有一些辅助方法的类别来尝试使其更具可读性,也许是这样的?
// NSNumber+PrimativeComparison.m
- (NSComparisonResult) compareWithInt:(int)i{
return [self compare:[NSNumber numberWithInt:i]]
}
- (BOOL) isEqualToInt:(int)i{
return [self compareWithInt:i] == NSOrderedSame;
}
- (BOOL) isGreaterThanInt:(int)i{
return [self compareWithInt:i] == NSOrderedDescending;
}
- (BOOL) isGreaterThanOrEqualToInt:(int)i{
return [self isGreaterThanInt:i] || [self isEqualToInt:i];
}
- (BOOL) isLessThanInt:(int)i{
return [self compareWithInt:i] == NSOrderedAscending;
}
- (BOOL) isLessThanOrEqualToInt:(int)i{
return [self isLessThanInt:i] || [self isEqualToInt:i];
}
然后事情变得更加人类可读:
if([x isGreaterThanOrEqualToInt:6000] && [x isLessThanOrEqualToInt:20000]){
//...
}
编辑 我刚刚注意到您还询问了为什么在货币场景中使用 NSDecimalNumber 是最佳选择。 This answer很好地说明了为什么在使用货币时 float (和 double )不够精确。此外,Apple's documentation for NSDecimalNumber建议您在进行以 10 为基数的算术时使用它。
关于objective-c - 比较 NSDecimalNumber 的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029860/