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

您是否尝试过使用 NSDecimalNumber 提供的算术运算?
我自己没有尝试过,但您似乎通过在数字实例的双精度值上使用标准运算符(*、/、...)来绕过 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 回答
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 回答