如何在不损失精度的情况下解码 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 中的数字小数时无法解决此问题。

目前唯一可能的解决方法是更改​​您的后端以将所有十进制数字发送为Strings,然后在将它们解码为Strings 后将它们转换为Decimals。

有关更多信息,请查看这个开放的 Swift 错误:SR-7054。

【讨论】:

以上是关于如何在不损失精度的情况下解码 NSDecimalNumber?的主要内容,如果未能解决你的问题,请参考以下文章

python如何在不损失质量的情况下调整(缩小)图像的大小

如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]

如何在不损失质量的情况下将 PNG 转换为 BMP

如何在不丢失 swift 精度的情况下将 String 转换为 Double [重复]

如何在不损失视网膜显示质量的情况下将 UIView 捕获到 UIImage

如何在不损失 Android 分辨率的情况下减小位图的大小?