0

私はこれについてしばらく前に同様のトピックを見てきましたが、それは方程式がどこかでNSNumberを使用したためであるように思われました。すべてのコードを確認しましたが、方程式にNSDecimalNumbersを使用していることがわかります。

いくつかの価格設定番号を返すJSONWebサービスを入手しました。

オブジェクトプロパティでそれらを解析した直後に、次の式を実行したいと思います。

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
4

2 に答える 2

1

NSLog() の出力が示すように、self.userData.RawPercentageself.userData.FixedPricenil、つまり、NSDecimalNumberオブジェクトとして割り当てられず、初期化されていません。

nil10 進数のゼロを表すために使用することはできません!

実際、あなたのコードを試すと、

NSDecimalNumber *custPrice1 = [oneWithNet decimalNumberByAdding:priceFixed];

priceFixedが nil であるためクラッシュします。

したがって、これらの変数が初期化されるコードをチェックし、それらが有効なNSDecimalNumberオブジェクトを指していることを確認する必要があります。


更新:エラー メッセージ

-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector sent to instance 0x84ad160

は、 ではなくオブジェクトでnettoPrijsあることを示しています。次の簡略化されたコードは、 aと aを乗算しようとするとどうなるかを示しています。NSNumberNSDecimalNumberNSDecimalNumberNSNumber

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があるオブジェクトであると想定しています。他の数値オブジェクトについても同様です。NSNumberNSDecimalNumber

于 2012-12-10T13:19:46.670 に答える
0

次を使用して修正しました:

- (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);
}

ご助力いただきありがとうございます!

于 2012-12-11T10:55:39.683 に答える