gpt4 book ai didi

ios - NSNumberFormatter numberFromString 在转换某些数字时添加了一小部分

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:29 28 4
gpt4 key购买 nike

我在我的 iPhone 应用程序中发现了一些奇怪的错误,我已将这些错误缩小到我对 NSNumberFormatter 的使用。

一个精简的例子...

在 Xcode Playground 上我有:

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 Playground 上,它出现在 8.03 左右。

我解决这个问题的一种方法是四舍五入小数。由于差异是 +/- 很小的数量,因此四舍五入到 4 个小数位应该可行。您可以使用各种舍入模式。在此示例中,我使用了 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/36044784/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com