我试图计算应用于产品的税额并将其显示在标签中时正在运行以下代码。这种税收应该使用银行家四舍五入(同NSNumberFormatterRoundHalfEven
)NSNumberFormatter在将NSDecimalNumber转换为NSString时四舍五入错误
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setRoundingMode:NSNumberFormatterRoundHalfEven];
NSDecimalNumber *decimalTax = [NSDecimalNumber decimalNumberWithString:@"3.785272"];
NSLog(@" tax : %@", decimalTax);
NSString *rightText = [formatter stringFromNumber: decimalTax];
NSLog(@" textLabel : %@", rightText);
此输出以下:
tax : 3.785272
textLabel : $3.79
当使用NSNumberFormatterRoundHalfEven
,税收应该轮3.78,而不是3.79。我无法弄清楚为什么它不尊重舍入模式。我认为这可能与NSNumberFormatterCurrencyStyle
与NSNumberFormatterRoundHalfEven
没有很好的搭配,所以我将样式更改为十进制,并将最小/最大小数位数设置为2,并且它仍然以完全相同的方式执行。
我想这可能是一些奇怪的事情与NSNumberFormatter
与NSDecimalNumber
交互所以我想这个代码,而不是:
NSDecimalNumberHandler *numberHandler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundBankers scale:2 raiseOnExactness:YES raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES];
NSDecimalNumber *decimalTax = [NSDecimalNumber decimalNumberWithString:@"3.785272"];
NSString *rightText = [[decimalTax decimalNumberByRoundingAccordingToBehavior:numberHandler] description];
但它仍然输出以下:
tax : 3.785272
textLabel : 3.79
我完全在现在想法的损失。有没有人发现我在这两种方法中的一个错误?我更喜欢使用第一种涉及NSNumberFormatter的方法,因为这可以帮助我避免大量的重构,但是如果我必须使用第二种方法来获得正确的答案,那就这样吧。
啊,这使得更有意义。我误解这意味着“如果数字在你四舍五入后等于”。这意味着3.785272会看到5,并且因为它在1和9之间是等距的,并且下降到3.78。感谢您为我清理! – Killectro