Как правильно хранить числа с плавающей точкой в базе данных SQLite3
пишу небольшое скрипт на Python к которому подкручена база данных SQLite3
Я записываю в базу данных числа с плавающей точкой ( или без неё ), чтобы потом вывести сумму этих чисел, но проблема в том что если в базе данных если число с двумя знаками после точки ( например: 14.55 ), то результат будет примерно вот таким: из списка с числами [55, 14.55, 21.9, 27, 27, 11.95, 45] выйдет вот такое число - 202.39999999999998. Если чисел с двумя знаками после точки не будет, всё будет нормально.
Числа в базу данных я записываю в виде float, а в базе данных я их храню real ( пробовал с numeric, но результат такой же )
Вопрос: как правильно складывать и хранить такие числа? Может лучше использовать другую базу данных?
Ответы (1 шт):
Здесь проблема не в базе данных, вы же при обычном сложении в интерпретаторе тот же результат получите
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