Objective c N小数乘法的奇异性
不久前我看到过关于这一点的讨论,但这似乎是因为方程式在某处使用了NSNumber。我检查了我所有的代码,我所能看到的是,我正在使用NSDEcimalNumber作为我的方程式 我得到了一个JSON Web服务,它返回一些定价数字 在对象属性中解析它们之后,我想用它们运行以下等式: 净价格*(1+(RawPercentage/100))+固定价格=处理后的净价格 更新: 我将代码更改为:Objective c N小数乘法的奇异性,objective-c,xcode,ios6,multiplication,nsdecimalnumber,Objective C,Xcode,Ios6,Multiplication,Nsdecimalnumber,不久前我看到过关于这一点的讨论,但这似乎是因为方程式在某处使用了NSNumber。我检查了我所有的代码,我所能看到的是,我正在使用NSDEcimalNumber作为我的方程式 我得到了一个JSON Web服务,它返回一些定价数字 在对象属性中解析它们之后,我想用它们运行以下等式: 净价格*(1+(RawPercentage/100))+固定价格=处理后的净价格 更新: 我将代码更改为: NSDecimalNumber *one = [NSDecimalNumber one];
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];
致:
它崩溃了:
-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160
正如您的NSLog()输出所示,self.userData.RawPercentage
和self.userData.FixedPrice
为nil
,即未分配+初始化为NSDecimalNumber
对象
nil
不能用于表示十进制数字零
事实上,当我尝试你的代码时
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
price = [NSDecimalNumber decimalNumberWithString:@"89.25"];
product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = 89.25
(我不知道为什么这不会崩溃或产生一些错误消息。)
如果与NSDecimalNumber相乘,则它可以正常工作:
NSDecimalNumber *one = [NSDecimalNumber one];
id price = [NSNumber numberWithFloat:89.25];
NSDecimalNumber *product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = -0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000221166721562906606351581184
price = [NSDecimalNumber decimalNumberWithString:@"89.25"];
product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = 89.25
因此,我假设self.netPrice
是一个NSNumber
对象,它必须转换为NSDecimalNumber
。这同样适用于其他数字对象。我使用以下方法修复了它:
- (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);
}
谢谢你的帮助 尽量集中你的问题。对我来说,在工作的这几分钟里,我的头脑太长了。为你编辑一下。希望这更集中:)你的问题到底是什么?我不明白你所说的“这个”是什么意思。为什么:89.25*(1+((null)/100))+(null)=-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000013363189343321587712?为什么你首先需要使用NSDecimalNumber
?我使用if(!property | | | property==NULL | |[property iskindof class:[NSNull class]]){property=[NSDecimalNumber zero];}
在所有这些之前检查它是否返回nil,然后将其设置为[NSDecimalNumber zero]
。希望有帮助。@VincentVeldkamp!property
和property==NULL
是相同的测试。在这种情况下,我无法重现问题,我的输出是“custPrice:89.25”。我将再次检查我的代码,并尝试检查哪里出错。将修复双重测试。谢谢你!