2014-02-12 41 views
0

我试图计算应用于产品的税额并将其显示在标签中时正在运行以下代码。这种税收应该使用银行家四舍五入(同NSNumberFormatterRoundHalfEvenNSNumberFormatter在将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。我无法弄清楚为什么它不尊重舍入模式。我认为这可能与NSNumberFormatterCurrencyStyleNSNumberFormatterRoundHalfEven没有很好的搭配,所以我将样式更改为十进制,并将最小/最大小数位数设置为2,并且它仍然以完全相同的方式执行。

我想这可能是一些奇怪的事情与NSNumberFormatterNSDecimalNumber交互所以我想这个代码,而不是:

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的方法,因为这可以帮助我避免大量的重构,但是如果我必须使用第二种方法来获得正确的答案,那就这样吧。

回答

2

不,这看起来对我来说是正确的行为。如果你看看RoundHalfEven的文档,它说

向最近的整数舍入,或者如果等距,则舍入偶数。

在你的情况3.785272 接近3.79比是3.78,因此它是不等距而且应该轮对偶数。

它应该只是圆整到一个偶数,如果它是真正的等距离,在你的情况下3.785会舍入到3.78。

+0

啊,这使得更有意义。我误解这意味着“如果数字在你四舍五入后等于”。这意味着3.785272会看到5,并且因为它在1和9之间是等距的,并且下降到3.78。感谢您为我清理! – Killectro

0

你可以试试:

[formatter setRoundingIncrement:[NSNumber numberWithDouble:0.001]]; 

这是帮助我和正常工作!

+0

如果我需要更改功能,我会记住这一点。我试图实施正确的银行家四舍五入,正如接受的评论所说,这是银行家四舍五入的正确功能。我只是误解了应该发生的事情。 – Killectro