8

NSDecimalNumber とその「動作」に混乱しています。$37.50 など、ドルの値を表す NSDecimalNumber があります。その数に 5.0 が何回含まれているかを調べて、何が残っているかを知りたいと思います。ストレートディビジョンを取得して7.50を取得できますが、7 mod 2.50が必要です。整数に変換できますが、「セント」を保存する必要があるため、フレームワークにいくつかのトリックがあるかどうか疑問に思っていますか?

4

5 に答える 5

9

Peter Hosey の例を使用しますが、iOS コードを使用します。

NSDecimalNumber *dividend = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:37.5] decimalValue]];

NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:5.0] decimalValue]];

NSDecimalNumber *quotient = [dividend decimalNumberByDividingBy:divisor withBehavior:[NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]];

NSDecimalNumber *subtractAmount = [quotient decimalNumberByMultiplyingBy:divisor];

NSDecimalNumber *remainder = [dividend decimalNumberBySubtracting:subtractAmount];
于 2011-07-29T15:27:04.410 に答える
6
  1. 被除数を除数で除算し、切り捨てます。これで商が得られます。
  2. 除数に商を掛けます。
  3. 配当金からそれを引きます。これで残りが得られます。

(37.50 // 5)== 7; 7 * 5 == 35; 37.50-35=2.50。

(注: Pythonの積分除算の演算子です。ここで借用しました。もちろん、 Objective-Cコードの除算に//実際に使用しようとしないでください。)//

于 2009-07-24T03:34:17.700 に答える
6

NSDecimalNumber負の数と負の約数でも機能するカテゴリを次に示します。

- (BOOL)isNegative
{
    return (NSOrderedDescending == [[NSDecimalNumber zero] compare:self]);
}

- (NSDecimalNumber *)invertedNumber
{
    NSDecimalNumber *negOne = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:YES];
    return [self decimalNumberByMultiplyingBy:negOne];
}

- (NSDecimalNumber *)moduloFor:(NSDecimalNumber *)divisor
{
    NSRoundingMode roundingMode = ([self isNegative] ^ [divisor isNegative]) ? NSRoundUp : NSRoundDown;
    NSDecimalNumberHandler *rounding = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode
                                                                                              scale:0
                                                                                   raiseOnExactness:NO
                                                                                    raiseOnOverflow:NO
                                                                                   raiseOnUnderflow:NO
                                                                                raiseOnDivideByZero:NO];

    // divide and get the remainder
    NSDecimalNumber *quotient = [self decimalNumberByDividingBy:divisor withBehavior:rounding];
    NSDecimalNumber *subtract = [quotient decimalNumberByMultiplyingBy:divisor];

    NSDecimalNumber *modulo = [self decimalNumberBySubtracting:subtract];
    if ([divisor isNegative]) {
        return [modulo invertedNumber];
    }
    return modulo;
}
于 2013-02-21T17:50:10.603 に答える
1

理論的には、NSDecimalNumberメソッド、、、およびを使用していくつかのトリックを実行decimalNumberByDividingBy:できdecimalNumberByMultiplyingBy:ますdecimalValue。数値を除算し、10進数の構造を取得し、構造から余りを計算してから、その余りを使用して新しい10進数を作成し、その余りに元の数値を掛けます。

ただし、これを行う簡単な方法は、必要な最大精度を計算し(小数点以下N桁と呼びます)、数値に10eNを掛けてから、整数値を取得して除算とmodを実行することです。それ。ただし、特に非常に大きな数の場合、データが失われるリスクがあります。したがって、必要な最大数を確認し、どのデータ型(存在する場合)が機能するかを判断してください。NSNumberはをサポートしunsignedLongLongValueます。

于 2009-07-24T03:32:41.727 に答える