如果没有完全重现问题的代码,很难确定,但我想你看到的是这种行为:
let amount = 1.6 // Double
let jsonObject = ["amount": amount]
let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject)
String(data: jsonData, encoding: String.Encoding.utf8)
Swift Foundation 的 JSON 序列化总是将数值格式化为全精度——因此双精度数 1.6 被格式化为1.6000000000000001
.
解决方案 1:发送字符串
如果服务器接受它,您可以并且应该发送一个字符串:
let amount = "1.6" // String
let jsonObject = ["amount": amount]
let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject)
String(data: jsonData, encoding: String.Encoding.utf8)
请注意,如果您正在处理金钱或其他任何需要精确值的事物,则字符串是发送此值的唯一正确方法:即使您将其拼写为1.6
,标准 JSON 解析器也可能会将其转换为接收端的浮点数.
解决方案 2:使用 Decimal 更改格式
如果您只是需要以较低的精度对其进行格式化以使其由于某种原因通过服务器上的验证,则可以将其作为 aDecimal
而不是 a嵌入到 JSON 中,Double
并且它的格式会有所不同:
let amount = 1.6
let jsonObject = ["amount": Decimal(amount)]
let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject)
String(data: jsonData, encoding: String.Encoding.utf8)
// {"amount":1.6}
您甚至可以操纵Decimal
以四舍五入到一定的精度。
但是请注意,这并不能避免浮点精度问题:您仍然根据 JSON 规范发送浮点数,并且它仍然很可能在接收端被解析为浮点数。