2016-02-01 25 views
0

我嘗試將float值轉換爲字符串並使用NSNumberFormatter。我做了一個舍入函數,並使用格式化程序進行字符串表示。格式化程序只應該執行區域設置和小數點符號。我最終的結果是錯誤的。帶有2個小數點的NSNumberFormatter會導致奇怪的結果

NSNumberFormatter *_numberFormatter = [[NSNumberFormatter alloc] init]; 
[_numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[_numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]]; 
[_numberFormatter setMaximumFractionDigits:2]; 
[_numberFormatter setRoundingMode: NSNumberFormatterRoundDown]; 
NSString* sumString = [_numberFormatter stringFromNumber:[NSNumber numberWithFloat:14.2f]]; 

是'14,19'。我不明白爲什麼當小數點在這裏只是1時,該值被舍入。舍入模式在這裏不應該做任何事情,或者我錯了。我可以使用'NSNumberFormatterRoundUp',但在某些情況下,結果可能是'14,21'?

回答

4

這裏的問題是基數爲2的浮點數(這是所有蘋果平臺使用的)不能準確地表示實數14.2。最接近的雙精度浮點數正好是14.199999999999999289457264239899814128875732421875。正如你所看到的,這略低於14.2。

您指定了NSNumberFormatterRoundDown舍入模式。這意味着格式化程序將打印出符合您的格式的最大數字(兩個小數位)並且小於或等於輸入數字。兩個小數位數小於或等於14.199999999999999289457264239899814128875732421875的最大十進制數是14.19。

如果您正在處理貨幣價值,您可能需要查看NSDecimalNumberNSDecimalNumberdouble慢得多,但是它是基本的10位浮點格式,所以它可以完全代表14.2。

+0

這是一個快速小提琴,它可以幫助你理解:https://coderpad.io/EEWPRCRD –

1

NSNumberFormatterRoundDown替換爲NSNumberFormatterRoundHalfUp

NSNumberFormatterRoundDown: 向零回合。

NSNumberFormatterRoundHalfDown: 朝最近的整數舍入,或者等距離時朝零。