大号

时间:2017-08-05 08:49:25

标签: swift numberformatter

我尝试使用此代码将字符串转换为数字,反之亦然。 此代码必须打印相同的输出。但它的输出不正确。 任何人都可以帮助我吗?

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

1 个答案:

答案 0 :(得分:4)

NumberFormatter在解析示例中的字符串时生成Int64。此类型可以精确表示数值。但格式化程序甚至对64位整数使用双重算法来计算数字的字符串表示。 double最多可以表示大约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进行格式化就足以获得准确的结果:

let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let d1 = 10123456789012349 as Decimal

print(formatter.string(from: d1 as NSNumber)!)