用于NSDecimalNumber的ceilf和floorf等效方法

rei*_*ein 1 cocoa cocoa-touch nsdecimalnumber

对于NSDecimalNumber类型,ceilf和floorf是否有等效的方法?我似乎找不到任何东西.

fjo*_*him 7

简单的解决方案:您可以获取数字对象的浮点值并调用ceilf()或floorf():

ceilf([decimalNumber floatValue]);
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用该– decimalNumberByRoundingAccordingToBehavior:方法.

首先,您需要为NSDecimalNumberBehaviors要使用的每种舍入模式实现协议:

@interface DecimalRounder : NSObject <NSDecimalNumberBehaviors> { }
@end

@implementation DecimalRounder

- (NSRoundingMode)roundingMode {
    return NSRoundUp;
}

- (short)scale {
    return 0;
}

@end
Run Code Online (Sandbox Code Playgroud)

然后(假设你的十进制数是12.5):

DecimalRounder *rounder = [[DecimalRounder alloc] init];
NSDecimalNumber *decimalNumber = [[NSDecimalNumber alloc] initWithFloat:12.5];
NSDecimalNumber *roundedNumber = [decimalNumber decimalNumberByRoundingAccordingToBehavior:rounder];
NSLog(@"decimalNumber: %@", decimalNumber);
NSLog(@"roundedNumber: %@", roundedNumber);
Run Code Online (Sandbox Code Playgroud)

你会得到:

decimalNumber: 12.5
roundedNumber: 13
Run Code Online (Sandbox Code Playgroud)

  • 我选择了第二个选项,因为转换为float(或double)会失去精度. (2认同)