исходная проблема? Я так понял, ты что-то с чем-то сравнивал?
В этом проблема > может в целом потеряться точность, если в числе много "типа значащих" цифр.
Это не такая уж и проблема, скорее особенность того как флоаты работают
Ну да, проблема. Точность флоата ты поменять не можешь, с этим надо жить и учитывать.
Ну да. Но вот эта особенность мне "мешает"
То есть решения нет. Ок 😄
Давай вернёмся к тому что ты пытаешься сделать. Возможно тебе нужен не float а Decimal или вообще int
Решение зависит от того, в чём на самом деле проблема. Пока ты так и не сказал.
Или не сравнивать флоаты равенством, например. ;-)
Нужно число с плавающей запятой. Decimal тоже генерирует числа с ноликами)
Что такое "число с ноликом"
чем мешает? в чем проблема вообще?
Число с плавающей запятой, где на N-позиции есть не значащий 0
Это тупо вопрос форматирования
Ты так и не объяснил, нафига тебе это. Хотя ответ, как это сделать, я тебе уже дал. Просто сам вопрос выглядит предельно бессмысленно.
ты всё время какие-то обрывки выдаешь. Мы так и не поняли в чем проблема.
Чтобы придумать решение, нужно понять проблему. Пока у нас типичная xy-problem.
Задача: Сгенерировал число с N кол-вом цифр после точки. Преобразовал это число в float и кинул в сервис JSON с этим числом. Сервис обработал и записал в БД число с N кол-вом цифр после точки Проблема: при сравнении чисел получаю ошибку Разбор ошибки: Ошибка в том, что число преобразованное в float имеет N-1 цифру Пример: сгенерировано 0.1110 преобразовано и отправлено в JSON 0.111 в БД записано 0.1110
Благодарю за помощь)
Решение: никогда не сравнивать float через ==.
Немного для контекста. То что ты видишь там ещё какую-то цифру — не значит, что она на самом деле есть и что может быть хоть какая-то гарантия, что при передаче она не поменяется.
1. Если ты работаешь с float, то забудь про десятичную точку. Компьютер хранит в двоичных разрядах в виде мантисса+экспонента 2. Дробные числа всегда хранятся с погрешностью. При вычислениях погрешность увеличивается. При преобразовании в десятичную систему и обратно ещё увеличивается. Float НИКОГДА нельзя сравнивать на точное равенство, только на приближенное
2. В моём случае сравнивается логика - переданное число именно так и записывается в БД
У БД есть полное право число подкорректировать под своё представление.
Если оно подкорректирует не по предоставленной логике - мне надо об этом знать)
Спасибо тебе огромное, оказывается, я просто забыл ввести «python manage.py migrate»
О какой логике речь?
в БД для хранения произвольных чисел обычно используется числовой тип, а не строка и ему плеватьна твои десятичные цифры
Ещё раз — флоаты так работают. И будут так работать, это не то что можно как-то поменять. Есть гарантия, что погрешность будет не больше определённого значения (в зависимости от того, что под капотом у базы для этих флоатов), но гарантии что число будет прямо таким же — нет.
Обсуждают сегодня