如何在不损失精度的情况下解码 NSDecimalNumber?
Posted
技术标签:
【中文标题】如何在不损失精度的情况下解码 NSDecimalNumber?【英文标题】:How would I decode a NSDecimalNumber without loss of precision? 【发布时间】:2019-06-28 11:12:34 【问题描述】:有没有办法告诉 JSONDecoder 将传入的小数转换为 字符串?
public struct Transaction: Decodable
public let total: NSDecimalNumber?
enum CodingKeys: String, CodingKey
case total = "AMOUNT"
public init(from decoder: Decoder) throws
let values = try decoder.container(keyedBy: CodingKeys.self)
let total = try values.decode(Decimal.self, forKey: .total)
self.total = NSDecimalNumber(decimal: total);
考虑当 AMOUNT 类似于 397289527598234759823475455622342424358363514.42 时会发生什么
我想使用我拥有的代码我会得到 nonConformingFloatDecodingStrategy 异常而无法从中恢复 或精度损失。
在整个 s.o. 中都记录了围绕愚蠢的 swift Decimal 的斗争。 特别是这里:
Making NSDecimalNumber Codable
【问题讨论】:
你必须把它作为String
在你的JSON
开头,否则它会先把它转换成Double
,然后再转换成你的类型。
***.com/a/62997953/2303865
是的@LeoDabus,这仅适用于您自己编码和解码值的情况,并且对于您无法控制的远程系统的数据完全有用
@AntonTropashko 试试这个***.com/a/55131900/2303865
【参考方案1】:
问题在于JSONDecoder
只是JSONSerialization
的包装器,它将十进制数在内部解码为Double
,并且仅在将它们转换为Decimal
之后。遗憾的是,除非您创建自己的 JSON 解码器,否则在使用 JSON 中的数字小数时无法解决此问题。
目前唯一可能的解决方法是更改您的后端以将所有十进制数字发送为String
s,然后在将它们解码为String
s 后将它们转换为Decimal
s。
有关更多信息,请查看这个开放的 Swift 错误:SR-7054。
【讨论】:
以上是关于如何在不损失精度的情况下解码 NSDecimalNumber?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]
如何在不丢失 swift 精度的情况下将 String 转换为 Double [重复]