gpt4 book ai didi

swift - 大量的 NumberFormatter 问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:19:00 26 4
gpt4 key购买 nike

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

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 位整数也使用 double 运算来计算数字的字符串表示形式。 double 最多可以表示大约 16 或 17 个十进制数字。这导致了令人惊讶的不同结果。

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

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)!)

关于swift - 大量的 NumberFormatter 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45520019/

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