NSNumberFormatter numberFromString is adding a small fraction when converting certain numbers

后端 未结 2 1673
甜味超标
甜味超标 2021-01-20 05:14

I\'m seeing some strange bugs in my iPhone app that I have narrowed down to my use of NSNumberFormatter.

A stripped down example...

In Xcode playground I h

2条回答
  •  误落风尘
    2021-01-20 05:35

    It looks like there is an issue with NSNumberFormatter. There are certain values where this rounding error creeps up. In the XCode 7.2.1 playground, it shows up around 8.03.

    One way that I've solved this is to round the decimal number. Since the difference is +/- a tiny amount, rounding to 4 fraction places should work. You can use various rounding modes. In this example I used 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!)")
    }
    

提交回复
热议问题