Читы SQLite для типов данных . В отличие от других баз данных, он игнорирует ваш объявленный тип столбца и угадывает тип на основе того, что вы вставляете. number
не является допустимым типом SQL, но SQLite это не волнует.
Числа с плавающей запятой являются лишь приблизительными и будут накапливать ошибки, если вы выполните для них вычисления. Это общая проблема с числами с плавающей запятой. SQLite превратит 1083.33
в число с плавающей запятой.
Вам понадобится число произвольной точности c тип данных , например decimal
или numeric
. К сожалению, в SQLite их нет.
Вы можете уменьшить проблему путем округления.
select
sum(amount),
round(5947.6-sum(amount), 2) difference
from a;
Но это не на 100% точно, так как ошибки все равно будут накапливаться, вы просто их устраните. в конце. Если вам нужна точность, сохраняйте все в целых числах и сдвигайте их значения на два десятичных знака.
sqlite> insert into a values(1006118,108333);
sqlite> insert into a values(1006123,61429);
sqlite> insert into a values(1006124,78333);
sqlite> insert into a values(1006096,78333);
sqlite> insert into a values(1006104,83333);
sqlite> insert into a values(1006115,53333);
sqlite> insert into a values(1006116,63333);
sqlite> insert into a values(1006092,68333);
sqlite> select sum(amount), 594760-sum(amount) difference from a;
sum(amount) difference
----------- ----------
594760 0