我尝试使用此代码将字符串转换为数字,反之亦然。
此代码必须打印相同的输出。但其输出不正确。
谁能帮我?
let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
if let r1 = formatter.number(from: "10123456789012349") , let r2 = formatter.string(from:r1){
print(r1) // output = 10123456789012349
print(r2) // output = 10123456789012348
}
这段代码也有同样的问题
print(formatter.string(from:NSNumber(value: 10123456789012349)))
//output is 10123456789012348
NumberFormatter
产生一个Int64
当它解析示例中的字符串时。这种类型可以准确地表示数值。但格式化程序甚至对于 64 位整数也使用双精度算术来计算数字的字符串表示形式。双精度数最多可以表示大约 16 或 17 位十进制数字。这导致了令人惊讶的不同结果。
您可以通过使用来避免这种情况Decimal
s:
let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.generatesDecimalNumbers = true
let r1 = formatter.number(from: "10123456789012349")
let r2 = formatter.string(from: r1!)
print(r1!) // 10123456789012349
print(r2!) // 10123456789012349
编辑:使用Decimal
s 进行格式化足以获得准确的结果:
let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let d1 = 10123456789012349 as Decimal
print(formatter.string(from: d1 as NSNumber)!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)