Я пытаюсь создать хэш объекта give после его быстрого преобразования в строку, но значения, закодированные в строке, отличаются.
print(myObjectValues.v) // 33.48
let mydata = try JSONEncoder().encode(myObjectValues)
let string = String(data: mydata, encoding: .utf8)!
print(string) // 33.47999999999999488
Здесь в myObjectValues содержится десятичное значение 33,48. Если я попытаюсь закодировать эти mydata в строку, возвращаемое значение будет 33.47999999999999488. Я пытался округлить десятичное значение до двух знаков, но последняя строка продолжает размещать это число. Я попытался сохранить его в String, а затем обратно в Decimal, но все же значение, возвращаемое в закодированной строке, составляет 33,479999999ish.
Я не могу использовать эту строку для вычисления и сравнения хэшей, так как хеш-значение, возвращаемое сервером, соответствует 33,48, что никогда не будет равно тому, что я получу с этим длинным значением.
Decimal(value)
. Это просто закодирует двоичное округленное значение (чего вы пытаетесь избежать).Decimal(33.48)
- 33,47999999999999488, потому что это значение Double, которое вы передали в Decimal.init. Если вы хотите создать Decimal с десятичным округлением, а не с двоичным округлением, вам нужно создать его из строки:Decimal("33.48")!
. Если вы это закодируете, все будет работать так, как вы ожидаете. - person Rob Napier   schedule 25.06.2021