我的函数是将字符串转换为十进制数
func getDecimalFromString(_ strValue: String) -> NSDecimalNumber {
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 1
formatter.generatesDecimalNumbers = true
return formatter.number(from: strValue) as? NSDecimalNumber ?? 0
}
但它没有按预期工作。有时它像这样返回
Optional(8.300000000000001)
Optional(8.199999999999999)
而不是 8.3 或 8.2。在字符串中,我有像“8.3”或“8.2”这样的值,但转换后的十进制不符合我的要求。有什么建议我犯错了吗?
最佳答案
将 generatesDecimalNumbers
设置为 true
并不像预期的那样工作。返回值是 NSDecimalNumber
的一个实例(可以准确表示值 8.3),但显然格式化程序首先将字符串转换为二进制 float (并且不能正好代表 8.3)。因此返回的十进制值只是近似正确。
这也被报告为一个错误:
另请注意(与文档相反),maximumFractionDigits
属性在解析 字符串时无效
变成一个数字。
有一个简单的解决方案:使用
NSDecimalNumber(string: strValue) // or
NSDecimalNumber(string: strValue, locale: Locale.current)
相反,取决于字符串是否已本地化。
或者使用 Swift 3 Decimal
类型:
Decimal(string: strValue) // or
Decimal(string: strValue, locale: .current)
例子:
if let d = Decimal(string: "8.2") {
print(d) // 8.2
}
关于swift - NumberFormatter 的 generatesDecimalNumbers 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43538661/