Форум сайта python.su
При запросе с группировкой и агрегатной суммой SUM, если суммируются числа типа float, то сумма получается не та (17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?
Офлайн
MaratDДа, нужно округление до целого ставить. Для интерпретатора такой float - это нормально.
При запросе с группировкой и агрегатной суммой SUM, если суммируются числа типа float, то сумма получается не та (17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?
Офлайн
MaratDне перестаю Вам удивляться, на форуме с 2016 года, 100+ сообщений накатались, а про такое первый раз слышите? Странно это как то. Вы питон познаете по часу раз в месяц?
(17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?
Офлайн
Здравствуйте.
float + float (float * float) результат непредсказуемый. Это понял давно. Например, 2 раза сложить получается нормальный результат (скорее всего тоже ошибаюсь). Если складываешь, например, 7 раз, то результат ненормальный. Просто думал, что SQLite “соображает” как суммировать.
Теперь вопрос к знатокам питона. Если float складывать (умножать) с int, то результат тоже непредсказуемый? Например, 2.667 + 1 = 3.667 (или 3.66666666666669). Практикой это полностью не проверишь.
Офлайн
MaratD
У вас два нормальных выхода
Использовать тип данных который подходит для данной задачи - Decimal, но придеться сменить СУБД так как SQLIte не умеет Decimal
если известна заранее необходимая точность кол-ва знаков после запятой, то работать с integer (например число вида 3.14 хранить как 314 и при выводе делить на 100)
Офлайн
MaratDВы совершенно не правы. Результат полностью предсказуемый. Если вы два раза выполните одинаковые действия с одинаковыми аргументами результат будет одинаковый.
float + float (float * float) результат непредсказуемый.
Офлайн
Здравствуйте.
Под одинаковыми аргументами понимается одинаковое количество знаков после запятой? То есть если два float с двумя знаками после запятой сложить, то результат не будет содержать 15 знаков после запятой? По умножению вопрос снимается 2.51 * 10 = 25.099999999999998
Офлайн
>>> 1.51+1.52 3.0300000000000002
Офлайн
Здравствуйте.
Как в цикле изменить записи базы.
c.execute('SELECT …') #в результате 2 записи
for k in c:
проверка условия
здесь первая запись обновляется c.execute('UPDATE…') и все
до второй дело не доходит.
Офлайн