Как правильно хранить числа с плавающей точкой в базе данных SQLite3

пишу небольшое скрипт на Python к которому подкручена база данных SQLite3

Я записываю в базу данных числа с плавающей точкой ( или без неё ), чтобы потом вывести сумму этих чисел, но проблема в том что если в базе данных если число с двумя знаками после точки ( например: 14.55 ), то результат будет примерно вот таким: из списка с числами [55, 14.55, 21.9, 27, 27, 11.95, 45] выйдет вот такое число - 202.39999999999998. Если чисел с двумя знаками после точки не будет, всё будет нормально.

Числа в базу данных я записываю в виде float, а в базе данных я их храню real ( пробовал с numeric, но результат такой же )

Вопрос: как правильно складывать и хранить такие числа? Может лучше использовать другую базу данных?


Ответы (1 шт):

Автор решения: denisnumb

Здесь проблема не в базе данных, вы же при обычном сложении в интерпретаторе тот же результат получите

sum([55, 14.55, 21.9, 27, 27, 11.95, 45])
202.39999999999998

Так что в базе вы можете хранить их хоть даже в виде строки, а потом преобразовывать во float.

Здесь получается такое число скорее из-за особенностей проблемы чисел с плавающей точкой. Результат получается верный.

Если вам нужно просто вывести с точностью до 2 знаков после запятой, то воспользуйтесь форматированием строки:

f'{числовое_значение:.кол-во_знаковf}'
print(f'{sum([55, 14.55, 21.9, 27, 27, 11.95, 45]):.2f}')
'202.40'

Если вам нужно именно конкретное значение в виде числа для дальнейшей работы, то можете также обрезать его вернув обратно во float уже отформатированное значение

a = float(f'{202.39999999999998:.2f}')
202.4
→ Ссылка