在 Swift 4 中通过 JSONDecoder 传递数字时失去精度

Losing precision when passing numbers through the JSONDecoder in Swift 4

提问人:David Wood 提问时间:9/18/2017 最后编辑:rmaddyDavid Wood 更新时间:9/18/2017 访问量:3747

问:

我正在向我们的服务器发送一些 JSON 数据,在此过程中,使用新的 Swift 4 JSONDecoder 对某些值进行编码时遇到了问题。以这个 playground 为例:

import Foundation

struct QuantyTest: Codable {
    var name: String
    var value: Float
}

let json = """
[
    {
        "name": "Length",
        "value": 9.87
    },
    {
        "name": "Width",
        "value": 9.95
    }
]
""".data(using: .utf8)!

let decoder = JSONDecoder()
var size = try decoder.decode([QuantyTest].self, from: json)
let encoder = JSONEncoder()
var encodSize = try? encoder.encode(size)
print(String(data: encodSize!, encoding: .utf8)!)

因此,我首先解码 JSON 并打印出结果(大小)。的输出如下所示:

[{name "Length", value 9.87}, {name "Width", value 9.95}]

一切都很好,但是当我使用 Swift JSONEncoder 将(大小)编码回 JSON 时,我得到以下输出:

[{"name":"Length","value":9.869999885559082},{"name":"Width","value":9.9499998092651367}]

我尝试将值更改为十进制或双精度,但我有类似的问题,十进制输出如下所示:

[{"name":"Length","value":9.869999999999997952},{"name":"Width","value":9.95}]

作为替身:

[{"name":"Length","value":9.8699999999999992},{"name":"Width","value":9.9499999999999993}]

我知道浮点数、双精度或十进制不是非常精确,但我不明白的是为什么在我通过 JSONEncoder 之前,使用 float 时输出窗口会显示正确的值。我真的不确定如何解决这个问题,任何建议将不胜感激。

iOS JSON Swift4

评论

0赞 Martin R 9/18/2017
为什么双精度在字典中的打印方式不同?的可能重复?– 打印字典调用其浮点条目,并以更高的精度打印值。debugDescription
1赞 Duan Nguyen 3/2/2018
请使用 Decimal 而不是 Float。但在某些情况下,Swift 4 中的 Codable 仍然是不正确的。希望苹果尽快修复它。您可以在此处查看问题:bugs.swift.org/browse/...
3赞 funct7 10/14/2018
该死的浮点数!!
4赞 Usuf 2/8/2019
看来这个问题仍然存在!
3赞 ZeMoon 3/12/2020
截至 2020 年 3 月仍然存在!

答: 暂无答案