Похоже, что JSONDecoder использует NSDecimalNumber за кулисами
struct Foo: Decodable {
let key: Int
}
// this is 1 + the mantissa of NSDecimalNumber.maximum
let json = "{\"key\":340282366920938463463374607431768211456}"
let coder = JSONDecoder()
let test = try! coder.decode(Foo.self, from: json.data(using: .utf8)!)
Даже в ошибке DecodingError число не точно представлено:
Parsed JSON number <340282366920938463463374607431768211450> does not fit in Int.
Так что используйте Decimal
, если вы хотите иметь возможность декодировать с максимальной точностью (хотя вы все еще можете молча потерять точность). В противном случае вам просто нужно кричать на того, кто посылает вам этот JSON.
Обратите внимание, что в то время как документация говорит, что
мантисса является десятичным целым числом вверхдо 38 цифр
На самом деле это 128-разрядное целое число без знака, поэтому оно может также представлять около 39 цифр, как показано выше.