如何在不损失精度的情况下解码NSDecimalNumber?

时间:2019-06-28 11:12:34

标签: swift codable nsdecimalnumber jsondecoder

有什么方法可以告诉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中都记录了围绕愚蠢的快速小数的斗争。 特别是在这里:

Making NSDecimalNumber Codable

1 个答案:

答案 0 :(得分:4)

问题在于,JSONDecoder只是JSONSerialization的包装器,它在内部将十进制数解码为Double,并且只有在将其转换为Decimal之后才解码。可悲的是,除非您创建自己的JSON解码器,否则在使用JSON中的数字小数时将无法解决此问题。

当前唯一可行的解​​决方法是更改​​后端以将所有十进制数字作为String发送,然后将其解码为Decimal后再将其转换为String

有关更多信息,请查看以下打开的Swift错误:SR-7054