Mel*_*emi 7 cocoa cocoa-touch objective-c nsnumber
我对NSDecimalNumber及其"行为"感到困惑.我有一个代表美元价值的NSDecimalNumber,比如37.50美元.我想知道多少次说5.0进入那个数字,然后知道剩下的是什么.我可以获得直线分度并获得7.50但我想要7 mod 2.50.我可以转换为整数,但需要保存"美分",所以想知道框架中是否有一些技巧?
使用Peter Hoseys示例,但使用iOS代码:
NSDecimalNumber *dividend = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:37.5] decimalValue]];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:5.0] decimalValue]];
NSDecimalNumber *quotient = [dividend decimalNumberByDividingBy:divisor withBehavior:[NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]];
NSDecimalNumber *subtractAmount = [quotient decimalNumberByMultiplyingBy:divisor];
NSDecimalNumber *remainder = [dividend decimalNumberBySubtracting:subtractAmount];
Run Code Online (Sandbox Code Playgroud)
这是一个NSDecimalNumber类别,也适用于负数和负除数:
- (BOOL)isNegative
{
return (NSOrderedDescending == [[NSDecimalNumber zero] compare:self]);
}
- (NSDecimalNumber *)invertedNumber
{
NSDecimalNumber *negOne = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:YES];
return [self decimalNumberByMultiplyingBy:negOne];
}
- (NSDecimalNumber *)moduloFor:(NSDecimalNumber *)divisor
{
NSRoundingMode roundingMode = ([self isNegative] ^ [divisor isNegative]) ? NSRoundUp : NSRoundDown;
NSDecimalNumberHandler *rounding = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode
scale:0
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
// divide and get the remainder
NSDecimalNumber *quotient = [self decimalNumberByDividingBy:divisor withBehavior:rounding];
NSDecimalNumber *subtract = [quotient decimalNumberByMultiplyingBy:divisor];
NSDecimalNumber *modulo = [self decimalNumberBySubtracting:subtract];
if ([divisor isNegative]) {
return [modulo invertedNumber];
}
return modulo;
}
Run Code Online (Sandbox Code Playgroud)
(37.50 // 5)== 7; 7*5 == 35; 37.50 - 35 = 2.50.
(注意://Python是整数除法的运算符.我在这里借用了它.显然,你实际上不应该尝试//在Objective-C代码中使用除法.)
理论上,您可以使用 NSDecimalNumber 方法decimalNumberByDividingBy:、decimalNumberByMultiplyingBy:和做一些技巧decimalValue。将数字相除,获取十进制数字结构,从该结构中找出余数,然后用该余数创建一个新的十进制数,并将该余数乘以原始数字。
然而,更简单的方法可能是计算出您想要的最大精度(将其称为小数点后 N 位),将数字乘以 10eN,然后获取整数值并进行除法和取模那。然而,您面临着丢失数据的风险,尤其是对于非常大的数字,因此请检查您想要的最大数字并找出哪种数据类型(如果有)适合您。NSNumber 确实支持unsignedLongLongValue.