3

これが私のコードスニップです。倍数を丸める方法がわかりません。

double m =  [tmpProduct.msrp doubleValue] ;
double d = [tmpProduct.discountPrice doubleValue];
double p = (d * 100 ) / m;

ここで tmpProduct.msrp と mpProduct.discountPrice は (NSDecimalNUMber *)

上記の操作から、p = 44.995757を得ました

(45%) に変換したいのですが、どうすればいいですか?

これが私が使用するものですが、それは役に立ちません。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:2];
[formatter setRoundingMode: NSNumberFormatterRoundDown];
[formatter stringFromNumber:[NSNumber numberWithDouble:p]]
4

2 に答える 2

1

この特定のケースでは、スタイルを NSNumberFormatterPercentStyle に設定し、小数点以下の最大桁数を 0 に設定することをお勧めします。そうすれば、丸めについて心配する必要はありません。これは私のために働く:

double p = d / m;  // note: not multiplying by 100 here

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterPercentStyle];
NSString *s = [formatter stringFromNumber:[NSNumber numberWithDouble:p]];

これにより、文字列「45%」が得られます。

于 2009-12-29T17:27:03.363 に答える
1

NSDecimalNumber が提供する算術演算を使用してみましたか?
私はそれを自分で試したことはありませんが、数値インスタンスの double 値で標準演算子 ( *、/、...) を使用して NSDecimalNumber の利点をバイパスしているようです。NSDecimalNumber: Performing Arithmetic
を見てください。

Objective-C は演算子のオーバーロードをサポートしていないため、次のようなメソッドを使用する必要があります。

- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber

更新:
NSDecimalNumber を使用した除算:

NSDecimalNumber* operandOne = [NSDecimalNumber decimalNumberWithString:@"1234.5"];
NSDecimalNumber* operandTwo = [NSDecimalNumber decimalNumberWithString:@"2335"];
NSDecimalNumber* result = [operandOne decimalNumberByDividingBy:operandTwo];
NSLog(@"%@", [result descriptionWithLocale:[NSLocale currentLocale]]);

を使用descriptionWithLocale:すると、正しいNSLocaleDecimalSeparator

更新 2:
丸めを忘れていました:
NSDecimalNumber はいくつかの丸めモードをサポートしています。
のドキュメントを読むdecimalNumberByRoundingAccordingToBehavior:

于 2009-12-28T21:30:13.980 に答える