Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 16, 2018 13:00:06

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite

При запросе с группировкой и агрегатной суммой SUM, если суммируются числа типа float, то сумма получается не та (17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?

Офлайн

#2 Фев. 16, 2018 15:34:19

gorodetskiykp
От:
Зарегистрирован: 2012-03-16
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite

MaratD
При запросе с группировкой и агрегатной суммой SUM, если суммируются числа типа float, то сумма получается не та (17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?
Да, нужно округление до целого ставить. Для интерпретатора такой float - это нормально.



Офлайн

#3 Фев. 16, 2018 19:49:55

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

sqlite

MaratD
(17 должно, получается 16,999999999999996). Можно как-то получить нормальную сумму?
не перестаю Вам удивляться, на форуме с 2016 года, 100+ сообщений накатались, а про такое первый раз слышите? Странно это как то. Вы питон познаете по часу раз в месяц?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Фев. 20, 2018 07:27:45

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite

Здравствуйте.
float + float (float * float) результат непредсказуемый. Это понял давно. Например, 2 раза сложить получается нормальный результат (скорее всего тоже ошибаюсь). Если складываешь, например, 7 раз, то результат ненормальный. Просто думал, что SQLite “соображает” как суммировать.
Теперь вопрос к знатокам питона. Если float складывать (умножать) с int, то результат тоже непредсказуемый? Например, 2.667 + 1 = 3.667 (или 3.66666666666669). Практикой это полностью не проверишь.

Офлайн

#5 Фев. 20, 2018 09:28:58

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

sqlite

MaratD
У вас два нормальных выхода
Использовать тип данных который подходит для данной задачи - Decimal, но придеться сменить СУБД так как SQLIte не умеет Decimal
если известна заранее необходимая точность кол-ва знаков после запятой, то работать с integer (например число вида 3.14 хранить как 314 и при выводе делить на 100)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Фев. 20, 2018 20:44:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

sqlite

MaratD
float + float (float * float) результат непредсказуемый.
Вы совершенно не правы. Результат полностью предсказуемый. Если вы два раза выполните одинаковые действия с одинаковыми аргументами результат будет одинаковый.



Офлайн

#7 Фев. 23, 2018 06:36:28

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite

Здравствуйте.
Под одинаковыми аргументами понимается одинаковое количество знаков после запятой? То есть если два float с двумя знаками после запятой сложить, то результат не будет содержать 15 знаков после запятой? По умножению вопрос снимается 2.51 * 10 = 25.099999999999998

Офлайн

#8 Фев. 23, 2018 12:34:03

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

sqlite

 >>> 1.51+1.52
3.0300000000000002

Офлайн

#9 Март 5, 2018 12:58:22

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite

Здравствуйте.
Как в цикле изменить записи базы.
c.execute('SELECT …') #в результате 2 записи
for k in c:
проверка условия
здесь первая запись обновляется c.execute('UPDATE…') и все
до второй дело не доходит.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version