objective-c - 比较 NSDecimalNumber 的不同方法

标签 objective-c ios nsdecimalnumber

例如,对于原语,我会这样做

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: 方法比较 NSDecimalNumberNSNumber 对象。 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/

相关文章:

ios - Cocoa-touch 中的自动引用计数 - 内联最佳实践

objective-c - 将 NSNumber 转换为 NSDecimalNumber

iphone - 如何取消删除已删除的 UIImage?

ios - 关于UAAppReviewManager中的默认值问题

iOS - 何时在主线程中调用 UI 更改函数

ios - 检测何时通过 App Delegate 的 UITabBarController 按下 tabBar 项目

objective-c - NSNumberFormatter,NSDecimalNumber和科学计数法

objective-c - {NSDecimalNumber integerValue} 在 iOS8 中表现异常

objective-c - 添加带有 UITableView 的自定义 UIViewController 作为 subview

objective-c - 在 Sprite-Kit 中更改 Sprite 图像