Потеря точности при передаче чисел через JSONDecoder в Swift 4IOS

Программируем под IOS
Ответить
Anonymous
 Потеря точности при передаче чисел через JSONDecoder в Swift 4

Сообщение Anonymous »

Я отправляю некоторые данные JSON на наш сервер, и в процессе возникают проблемы при кодировании определенных значений с помощью нового Swift 4 JSONDecoder. Возьмем, к примеру, эту игровую площадку:

Код: Выделить всё

import Foundation

struct QuantyTest: Codable {
var name: String
var value: Float
}

let json = """
[
{
"name": "Length",
"value": 9.87
},
{
"name": "Width",
"value": 9.95
}
]
""".data(using: .utf8)!

let decoder = JSONDecoder()
var size = try decoder.decode([QuantyTest].self, from: json)
let encoder = JSONEncoder()
var encodSize = try? encoder.encode(size)
print(String(data: encodSize!, encoding: .utf8)!)
Поэтому я сначала декодирую JSON и распечатываю результат (размер). Вывод выглядит следующим образом:

Код: Выделить всё

[{name "Length", value 9.87}, {name "Width", value 9.95}]
Все хорошо, но когда я кодирую (размер) обратно в JSON с помощью Swift JSONEncoder, я получаю следующий результат:

Код: Выделить всё

[{"name":"Length","value":9.869999885559082},{"name":"Width","value":9.9499998092651367}]
Я пробовал изменить значение на десятичное или двойное, но у меня возникли аналогичные проблемы: десятичный вывод выглядит следующим образом:

Код: Выделить всё

[{"name":"Length","value":9.869999999999997952},{"name":"Width","value":9.95}]
и как двойной:

Код: Выделить всё

[{"name":"Length","value":9.8699999999999992},{"name":"Width","value":9.9499999999999993}]
Я понимаю, что числа с плавающей запятой, двойные или десятичные числа не очень точны, но я не понимаю, почему окно вывода показывает правильные значения при использовании числа с плавающей запятой, пока я не пройти через JSONEncoder. Я не совсем понимаю, как обойти эту проблему, буду очень признателен за любые предложения.

Подробнее здесь: https://stackoverflow.com/questions/462 ... in-swift-4
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»