我試圖計算應用於產品的稅額並將其顯示在標籤中時正在運行以下代碼。這種稅收應該使用銀行家四捨五入(同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