2014-02-12 55 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