我见过一个关于这个的similar topic,但是这似乎是因为等式在某个地方使用了NSNumber。我已经检查了我的所有代码,我所能看到的就是我正在使用NSDecimalNumbers作为我的方程。
我得到了一个JSON got服务,它返回一些定价号。
在对象属性中解析它们之后,我想用它们运行以下等式:
NetPrice *(1+ (RawPercentage / 100)) + FixedPrice = processedNetPrice
更新:我将代码更改为:
NSDecimalNumber *one = [NSDecimalNumber one];
if (!self.netPrice || [self.netPrice isKindOfClass:[NSNull class]])
{ self.netPrice = [NSDecimalNumber zero]; }
NSDecimalNumber *nettoPrijs = self.netPrice;
NSLog(@"self.netPrice = %@",self.netPrice);
//Returns: self.netPrice = 89.25
NSLog(@"nettoPrijs = %@",nettoPrijs);
//Returns: nettoPrijs = 89.25
if (!self.userData.BandFixed || [self.userData.BandFixed isKindOfClass:[NSNull class]])
{ self.userData.BandFixed = [NSDecimalNumber zero]; }
NSDecimalNumber *fixedPrice = self.userData.BandFixed;
NSLog(@"self.userData.BandFixed = %@",self.userData.BandFixed);
//Returns: self.userData.BandFixed = 0
NSLog(@"fixedPrice = %@",fixedPrice);
//Returns: fixedPrice = 0
if (!self.userData.BandPercentage || [self.userData.BandPercentage isKindOfClass:[NSNull class]])
{ self.userData.BandPercentage = [NSDecimalNumber zero]; }
NSDecimalNumber *rawPercentage = self.userData.BandPercentage;
NSLog(@"self.userData.BandPercentage = %@",self.userData.BandPercentage);
//Returns: self.userData.BandPercentage = 0
NSLog(@"rawPercentage = %@",rawPercentage);
//Returns: rawPercentage = 0
NSDecimalNumber *percentage = [rawPercentage decimalNumberByMultiplyingByPowerOf10:-2];
NSLog(@"percentage = %@",percentage);
//Returns: percentage = 0
NSDecimalNumber *onePercent = [one decimalNumberByAdding:percentage];
NSLog(@"onePercent = %@",onePercent);
//Returns: onePercent = 1
NSDecimalNumber *onePercentTimesNetPrice = [onePercent decimalNumberByMultiplyingBy:nettoPrijs];
NSLog(@"onePercentTimesNetPrice = %@",onePercentTimesNetPrice);
//Returns: onePercentTimesNetPrice =
-0.000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000359498933794611654993903616
NSDecimalNumber *addingFixed = [onePercentTimesNetPrice decimalNumberByAdding:fixedPrice];
NSLog(@"addingFixed = %@",addingFixed);
//Returns: addingFixed =
-0.000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000359498933794611654993903616如果我改变了:
NSDecimalNumber *onePercentTimesNetPrice = [onePercent decimalNumberByMultiplyingBy:nettoPrijs];至:
NSDecimalNumber *onePercentTimesNetPrice = [nettoPrijs decimalNumberByMultiplyingBy:onePercent];它崩溃了:
-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160发布于 2012-12-10 13:19:46
正如您的NSLog()输出所示,self.userData.RawPercentage和self.userData.FixedPrice是nil,即没有将+初始化为NSDecimalNumber对象。
nil不能用来表示十进制数0!
事实上,当我尝试你的代码时,
NSDecimalNumber *custPrice1 = [oneWithNet decimalNumberByAdding:priceFixed];因为priceFixed为零而崩溃。
因此,您应该检查这些变量初始化的代码,并确保它们指向有效的NSDecimalNumber对象。
更新:错误消息
-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160显示nettoPrijs是NSNumber对象,而不是NSDecimalNumber。下面的简化代码显示了如果您试图将NSDecimalNumber与NSNumber相乘会发生什么
NSDecimalNumber *one = [NSDecimalNumber one];
id price = [NSNumber numberWithFloat:89.25];
NSDecimalNumber *product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = -0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000221166721562906606351581184(我不知道为什么这不会崩溃或产生一些错误消息。)如果您与NSDecimalNumber相乘,它将正确工作。
price = [NSDecimalNumber decimalNumberWithString:@"89.25"];
product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = 89.25因此,我假设self.netPrice是一个必须转换为NSDecimalNumber的NSNumber对象。同样的情况也适用于其他数字对象。
发布于 2012-12-11 10:55:39
我用以下方法修复了它:
- (void) doMath
{
NSDecimalNumber *one = [NSDecimalNumber one];
NSLog(@"Band: %@ one = %@",self,one);
if (!self.netPrice || [self.netPrice isKindOfClass:[NSNull class]]) { self.netPrice = [NSDecimalNumber zero]; }
NSDecimalNumber *nettoPrijs = self.netPrice;
NSLog(@"self.netPrice = %@",self.netPrice);
NSLog(@"nettoPrijs = %@",nettoPrijs);
if (!self.userData.BandFixed || [self.userData.BandFixed isKindOfClass:[NSNull class]]) { self.userData.BandFixed = [NSDecimalNumber zero]; }
NSDecimalNumber *fixedPrice = self.userData.BandFixed;
NSLog(@"self.userData.BandFixed = %@",self.userData.BandFixed);
NSLog(@"fixedPrice = %@",fixedPrice);
if (!self.userData.BandPercentage || [self.userData.BandPercentage isKindOfClass:[NSNull class]]) { self.userData.BandPercentage = [NSDecimalNumber zero]; }
NSDecimalNumber *rawPercentage = self.userData.BandPercentage;
NSLog(@"self.userData.BandPercentage = %@",self.userData.BandPercentage);
NSLog(@"RawPercentage = %@",rawPercentage);
NSDecimalNumber *percentage = [rawPercentage decimalNumberByMultiplyingByPowerOf10:-2];
NSLog(@"percentage = %@",percentage);
NSDecimalNumber *onePercent = [one decimalNumberByAdding:percentage];
NSLog(@"onePercent = %@",onePercent);NSDecimalNumber gertje = NSDecimalNumber decimalNumberWithDecimal:nettoPrijs.decimalValue;* NSDecimalNumber *onePercentTimesNetPrice = gertje decimalNumberByMultiplyingBy:onePercent;
NSLog(@"onePercentTimesNetPrice = %@",onePercentTimesNetPrice);
NSDecimalNumber *addingFixed = [onePercentTimesNetPrice decimalNumberByAdding:fixedPrice];
NSLog(@"addingFixed = %@",addingFixed);
}谢谢你的帮助!
https://stackoverflow.com/questions/13801126
复制相似问题