Iphone NSNumberFormatter和舍入百分比值

Iphone NSNumberFormatter和舍入百分比值,iphone,objective-c,nsdecimalnumber,Iphone,Objective C,Nsdecimalnumber,这是我的密码剪报,我不知道如何将双数舍入 double m = [tmpProduct.msrp doubleValue] ; double d = [tmpProduct.discountPrice doubleValue]; double p = (d * 100 ) / m; 此处tmpProduct.msrp和mpProduct.discountPrice是(NSDecimalNUmber*) 通过上面的运算,我得到了p=44.995757 我想把它转换成(45%),我该怎么做 这里

这是我的密码剪报,我不知道如何将双数舍入

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]]

您是否尝试过使用NSDecimalNumber提供的算术运算?
我自己也没有尝试过,但似乎您在数字实例的双值上使用标准运算符(*,/,…),从而绕过了NSDecimalNumber的优点。
看看

由于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]]);
通过使用
description with locale:
,可以获得正确的
nslocaledecimalsepator

更新2:
我忘了四舍五入:
NSDecimalNumber支持多种舍入模式。

阅读

的文档在本例中,我建议将样式设置为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%”

感谢您的回复。我尝试了这个NSDecimalNumber*d1=[tmpProduct.折扣价格decimalNumberByDividingBy:tmpProduct.msrp];但这给了我一个例外(这里是我得到的值discountprice=1234.5,masrp是2335),我用一个小例子更新了我的答案,这个例子使用了你粘贴的值。这里很好用。也许你可以发布更多细节?您是否使用核心数据/绑定等…?感谢您的回复。这里有更多详细信息。我在json格式中获取tmpProduct.DiscountedPrice和tmpProduct.msrp的值,并使用TouchJson进行解析。self.msrp=[aDictionary valueForKey:kMSRP];self.discountPrice=[aDictionary valueForKey:kDiscountPrice];当我尝试使用这个NSDecimalNumber*d1=[tmpProduct.declintprice decimalNumberByDividingBy:tmpProduct.declintprice];这给了我例外吗?所以我想知道我从TouchJson得到的是原始数据问题吗?为什么我可以使用我的tmp.DiscountedPrice,而不按照您所说的再次转换它?我不使用任何核心数据。我发现了问题。这是数据问题。现在我得到的价格是像“2500.00”这样的字符串,然后我像这样转换,但我的原始问题仍然存在,如果百分比=45.72,它应该四舍五入到46%,或者如果是44.32,那么是44%?当你处理价格和货币时,我会选择NSDecimalNumber路线。我刚刚更新了我的原始答案,添加了一个指向苹果文档中“四舍五入”部分的链接。