我在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/

10-14 21:02