首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDecimalNumber增殖奇异性

NSDecimalNumber增殖奇异性
EN

Stack Overflow用户
提问于 2012-12-10 12:40:19
回答 2查看 1.3K关注 0票数 0

我见过一个关于这个的similar topic,但是这似乎是因为等式在某个地方使用了NSNumber。我已经检查了我的所有代码,我所能看到的就是我正在使用NSDecimalNumbers作为我的方程。

我得到了一个JSON got服务,它返回一些定价号。

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

NetPrice *(1+ (RawPercentage / 100)) + FixedPrice = processedNetPrice

更新:我将代码更改为:

代码语言:javascript
复制
    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

如果我改变了:

代码语言:javascript
复制
NSDecimalNumber *onePercentTimesNetPrice = [onePercent decimalNumberByMultiplyingBy:nettoPrijs];

至:

代码语言:javascript
复制
NSDecimalNumber *onePercentTimesNetPrice = [nettoPrijs decimalNumberByMultiplyingBy:onePercent];

它崩溃了:

代码语言:javascript
复制
-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-10 13:19:46

正如您的NSLog()输出所示,self.userData.RawPercentageself.userData.FixedPricenil,即没有将+初始化为NSDecimalNumber对象。

nil不能用来表示十进制数0!

事实上,当我尝试你的代码时,

代码语言:javascript
复制
NSDecimalNumber *custPrice1 = [oneWithNet decimalNumberByAdding:priceFixed];

因为priceFixed为零而崩溃。

因此,您应该检查这些变量初始化的代码,并确保它们指向有效的NSDecimalNumber对象。

更新:错误消息

代码语言:javascript
复制
-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160

显示nettoPrijsNSNumber对象,而不是NSDecimalNumber。下面的简化代码显示了如果您试图将NSDecimalNumberNSNumber相乘会发生什么

代码语言:javascript
复制
NSDecimalNumber *one = [NSDecimalNumber one];
id price = [NSNumber numberWithFloat:89.25];
NSDecimalNumber *product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = -0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000221166721562906606351581184

(我不知道为什么这不会崩溃或产生一些错误消息。)如果您与NSDecimalNumber相乘,它将正确工作。

代码语言:javascript
复制
price = [NSDecimalNumber decimalNumberWithString:@"89.25"];
product = [one decimalNumberByMultiplyingBy:price];
NSLog(@"product = %@", product);
// Output:
// product = 89.25

因此,我假设self.netPrice是一个必须转换为NSDecimalNumberNSNumber对象。同样的情况也适用于其他数字对象。

票数 1
EN

Stack Overflow用户

发布于 2012-12-11 10:55:39

我用以下方法修复了它:

代码语言:javascript
复制
- (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;

代码语言:javascript
复制
    NSLog(@"onePercentTimesNetPrice = %@",onePercentTimesNetPrice);
    NSDecimalNumber *addingFixed = [onePercentTimesNetPrice decimalNumberByAdding:fixedPrice];
    NSLog(@"addingFixed = %@",addingFixed);
}

谢谢你的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13801126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档