我正在向我们的服务器发送一些 JSON 数据,但在使用新的 Swift 4 JSONDecoder 编码某些值时遇到问题。以这个游乐场为例:
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}]
我知道 float 、 double 或decimal 并不是非常精确,但我不明白的是为什么输出窗口在使用 float 时显示正确的值,直到我通过 JSONEncoder。我不太确定如何解决这个问题,任何建议将不胜感激。
2025更新
此示例现在适用于
Float
或 Decimal
。如果需要数值精度/稳定性(例如价格),我建议一般不要使用 Float
。