【问题标题】:NumberFormatter issue for large number大数的 NumberFormatter 问题
【发布时间】:2017-08-05 08:49:25
【问题描述】:

我尝试使用此代码将字符串转换为数字,反之亦然。 此代码必须打印相同的输出。但它的输出不正确。 谁能帮帮我?

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

【问题讨论】:

    标签: swift numberformatter


    【解决方案1】:

    NumberFormatter 在解析示例中的字符串时会生成Int64。这种类型可以准确地表示数值。但是格式化程序甚至对 64 位整数使用双精度算术来计算数字的字符串表示形式。 double 最多可以表示大约 16 或 17 个十进制数字。这导致了令人惊讶的不同结果。

    您可以使用Decimals 来避免这种情况:

    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
    

    编辑:使用Decimals 进行格式化足以获得准确的结果:

    let formatter: NumberFormatter = NumberFormatter()
    formatter.locale = Locale(identifier: "en_US")
    let d1 = 10123456789012349 as Decimal
    
    print(formatter.string(from: d1 as NSNumber)!)
    

    【讨论】:

    • let r1 = formatter.string(from: 10123456789012349 as NSNumber), let r2 = formatter.number(from: r1) 都是 10123456789012348
    • @Adrian Bobrowski:是的,因为第一条语句中的格式化程序使用双精度运算。
    • 我该如何处理? 123456789012345678901234
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多