我在iPhone应用程序中看到一些奇怪的错误,这些错误已缩小为我使用NSNumberFormatter的范围。
一个简单的例子...
在Xcode游乐场中,我有:
let numberFormatter = NSNumberFormatter()
//numberFormatter.numberStyle = .DecimalStyle - does not change behavior
let numberString = "546000.06"
let number: NSNumber = numberFormatter.numberFromString(numberString)!
print("number: \(number)")
let number1: NSNumber = NSDecimalNumber(string: numberString)
print("number1: \(number1)")
这是输出:
number: 546000.0600000001
number1: 546000.06
请注意,将numberStyle设置为.DecimalStyle不会更改任何内容。
仅对于某些数值会发生此问题(例如,8.03是另一个)。我认为NSNumberFormatter对于这种类型的转换是安全的,并且我在互联网上没有看到太多有关此问题的声音,所以我想假设这是我做错的事情。
谁能解释我所看到的?很感谢任何形式的帮助!
最佳答案
看来NSNumberFormatter存在问题。在某些值上,此舍入误差会逐渐增加。在XCode 7.2.1游乐场中,它显示在8.03附近。
我解决此问题的一种方法是四舍五入十进制数。由于差异为+/-很小的数量,因此应四舍五入到小数位。您可以使用各种舍入模式。在此示例中,我使用了RoundPlain。
var initialValue = NSDecimalNumber(string: "7")
let handler = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundPlain, scale: 4, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
let numberFormatter = NSNumberFormatter()
for index in 1...300 {
initialValue = initialValue.decimalNumberByAdding(0.01)
let stringValue = "\(initialValue)"
var number = numberFormatter.numberFromString(stringValue)
var decimalNumber: NSDecimalNumber = NSDecimalNumber(decimal: number!.decimalValue)
decimalNumber = decimalNumber.decimalNumberByRoundingAccordingToBehavior(handler)
print("stringValue = \(stringValue), decimalNumber = \(decimalNumber), number = \(number!)")
}
关于ios - NSNumberFormatter numberFromString在转换某些数字时会添加一小部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36068165/