0

これらのivarに対して次の値があるとします。

NSString*パーセンテージ=35NSString*値=146

以下のコードでは、乗算(146 * .35)を実行すると51.1になると期待していますが、代わりに100を取得しています。

- (NSDecimalNumber*) getProductByPercentage : (NSArray*) itemsToMultiply : (float) annualPatients {

    //get items from array
    NSString* percentage = [itemsToMultiply objectAtIndex:0];
    NSString* value = [itemsToMultiply objectAtIndex:1];

    //init a number formatter
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    //set its formatting style
    [f setNumberStyle:NSNumberFormatterDecimalStyle];

    //convert to percentage
    float thisPercentage = [percentage floatValue]/100;

    //convert to NSDecimal
    NSDecimalNumber* decPercentage = [[NSDecimalNumber alloc] initWithString:[NSString stringWithFormat:@"%f",  thisPercentage]];
    NSDecimalNumber* decAvgReimbursement = [[NSDecimalNumber alloc] initWithString: value];
    NSDecimalNumber* decAnnualPatients = [[NSDecimalNumber alloc] initWithString:[NSString stringWithFormat:@"%f", annualPatients]];

    //set up handler
    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
            scale:-2
            raiseOnExactness:NO
            raiseOnOverflow:NO
            raiseOnUnderflow:NO
            raiseOnDivideByZero:NO
    ];

    //get our results
    NSDecimalNumber* decAvgCost = [decAvgReimbursement decimalNumberByMultiplyingBy:decPercentage
                                                                 withBehavior:handler];

    NSLog(@"%@::%@::%@", decAvgCost, decAvgReimbursement, decPercentage);

    return decAvgCost;
}

これが私のログ出力です

2013-02-04 13:57:46.960 EUS Calculator[34154:c07] 100::146::0.35

ハンドラーに何か問題があり、間違った結果が得られていますか?

4

3 に答える 3

2
scale:-2

スケールを小数点以下2桁、つまり最も近い100に丸めるように設定しています。

于 2013-02-04T19:06:42.327 に答える
1

間違ったスケールに丸めています。スケールを0(小数点を削除)に変更して、再試行してください。小数点以下1桁が必要な場合は、スケール1を使用します。その場合、51.1を取得する必要があります。

于 2013-02-04T19:05:14.440 に答える
1

これを変える:

float thisPercentage = [percentage floatValue]/100;

これに:

float thisPercentage = [percentage floatValue]/100.0;

.0を指定しない場合、コンパイラはそれを整数として解釈し、float / intを実行すると、それをintに変換し、予想される0.35を0に変換します。

また、NSNumberFormatterはどこでも使用していないため、作成しない方がよいでしょう。

NSDecimalNumbersとにかく使っているのはなぜですか?

于 2013-02-04T19:05:54.783 に答える