Objective c N小数乘法的奇异性

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];

不久前我看到过关于这一点的讨论,但这似乎是因为方程式在某处使用了NSNumber。我检查了我所有的代码,我所能看到的是,我正在使用NSDEcimalNumber作为我的方程式

我得到了一个JSON Web服务,它返回一些定价数字

在对象属性中解析它们之后,我想用它们运行以下等式:

净价格*(1+(RawPercentage/100))+固定价格=处理后的净价格

更新: 我将代码更改为:

    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”。我将再次检查我的代码,并尝试检查哪里出错。将修复双重测试。谢谢你!