|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
Привет всем. Работаю на Linux. Sqlite версии 3.19.3-3 Имею вот такую табличку с данными Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Выполняю запрос Код: sql 1.
В результате получаю Код: sql 1. 2. 3.
Про запись числа double знаю, но блин такое поведение крайне неожиданное. Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0? Может тип поля, может какой-то хитрый формат записи числа? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2018, 17:00 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
YP977Про запись числа double знаю, но блин такое поведение крайне неожиданное. Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0? Может тип поля, может какой-то хитрый формат записи числа?Ну почему вдруг поведение неожиданное? Вполне ожидаемое и нормальное. А вараинты решения: - Храни дробные числа в целом виде. При вводе, умножай на сто, при выводе на экран дели на сто, но чтобы в базе всегда лежали целые числа и вся арифметика была целочисленной. - Плевать что выведет простой select, ты знаешь что работаешь с дробными числами и будут погрешности. При выводе результатов для пользователя делай округление до нужной разрядности. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2018, 18:41 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
White Owl, Да вот не хотелось бы иметь головняк с таким поведением. Для денег, там я все храню в копейках и так далее. Тут же количество товара. В общем случае будет три знака после запятой, т.е. все нужно будет умножать на 1000. А есть еще коэффициенты единиц измерения и там возможно тоже будут какие-то жуткие коэффициенты и умножать нужно будет на 100000 например. Проще уж округлять при выполнении select-a. А неожиданное хотя бы потому, что postgres посчитал 0. Лень проверять на всех доступных СУБД (точнее есть чем заняться и без этого), но есть подсознательная уверенность, что у всех других все таки будет 0. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2018, 18:53 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
Ноль или не ноль - зависит исключительно от формата вывода. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2018, 18:55 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
YP977А неожиданное хотя бы потому, что postgres посчитал 0. Лень проверять на всех доступных СУБД (точнее есть чем заняться и без этого), но есть подсознательная уверенность, что у всех других все таки будет 0. :)Нет, все базы считают с теми-же самыми погрешностями, они исходят из общей же проблемы конвертации базы счислений. Просто базы существуют не в вакууме, у них есть такая вещь как "стандартный управляющий клиент" :) А вот как написан этот клиент и делает ли он неявное округление перед выводом результатов - это уже вопрос другой. У большинства СУБД (особенно у тех которые имеют стандартные типы данных с фиксированной запятой) результаты расчетов при конвертации числа в строку принудительно приводятся к типу операндов. А для результатов с плавающей запятой обычно используется приведение к numeric(19,4) или numeric(19,6), с соответсвующими округлениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2018, 00:19 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
YP977 Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0? Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2018, 11:04 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
White OwlНет, все базы считают с теми-же самыми погрешностями, они исходят из общей же проблемы конвертации базы счислений. Просто базы существуют не в вакууме, у них есть такая вещь как "стандартный управляющий клиент" :) Согласен. Не так выразился. pit_alex Код: sql 1.
Прикольное решение :) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2018, 11:48 |
|
Sqlite округление numeric
|
|||
---|---|---|---|
#18+
YP977Прикольное решение :) Спасибо. это не решение это костыль :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2018, 12:54 |
|
|
start [/forum/topic.php?desktop=1&fid=54&tid=2008466]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 144ms |
0 / 0 |