Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite округление numeric / 9 сообщений из 9, страница 1 из 1
11.01.2018, 17:00
    #39582687
YP977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
Привет всем.
Работаю на 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.
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;

CREATE TABLE [front.rest_motion]
(
    [id_motion] integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    [id_goods] integer NOT NULL,
    [id_series] text NOT NULL,
    [id_outlet] integer NOT NULL,
    [id_workplace] integer,
    [quantity] numeric NOT NULL,
    [time_motion] text NOT NULL,
    [note] text,
    [guid] text NOT NULL,
    [time_create] text,
    [time_change] text,
    FOREIGN KEY ([id_goods])
    REFERENCES [front.goods] ([id_goods]),
    FOREIGN KEY ([id_outlet])
    REFERENCES [front.outlet] ([id_outlet]),
    FOREIGN KEY ([id_goods], [id_series])
    REFERENCES [front.series] ([id_goods], [id_series])
);

INSERT INTO "front.rest_motion" VALUES(62,3097,'20450',1,1,1,'2018-01-11T13:05:21','Перемещение: АСЦБ-000009','9f4e6f25-7719-4f62-863b-5b3afc9ae400','2018-01-11T13:05:21','2018-01-11T13:05:21');
INSERT INTO "front.rest_motion" VALUES(65,3097,'20450',1,1,-0.66,'2018-01-11T13:07:20','sales','a92ff1cb-8bd9-4a0c-9f07-2f8606d6665f','2018-01-11T13:07:20','2018-01-11T13:07:20');
INSERT INTO "front.rest_motion" VALUES(70,3097,'20450',1,1,-0.34,'2018-01-11T13:11:18','sales','d6d2d1fc-64f2-44f4-8152-9875dce64b3d','2018-01-11T13:11:18','2018-01-11T13:11:18');

PRAGMA writable_schema=OFF;
COMMIT;



Выполняю запрос
Код: sql
1.
select sum(quantity) from [front.rest_motion] where id_goods=3097;



В результате получаю
Код: sql
1.
2.
3.
sum(quantity)
---------------------
-5.55111512312578e-17



Про запись числа double знаю, но блин такое поведение крайне неожиданное.

Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0?
Может тип поля, может какой-то хитрый формат записи числа?
...
Рейтинг: 0 / 0
11.01.2018, 18:41
    #39582754
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
YP977Про запись числа double знаю, но блин такое поведение крайне неожиданное.

Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0?
Может тип поля, может какой-то хитрый формат записи числа?Ну почему вдруг поведение неожиданное? Вполне ожидаемое и нормальное.

А вараинты решения:
- Храни дробные числа в целом виде. При вводе, умножай на сто, при выводе на экран дели на сто, но чтобы в базе всегда лежали целые числа и вся арифметика была целочисленной.
- Плевать что выведет простой select, ты знаешь что работаешь с дробными числами и будут погрешности. При выводе результатов для пользователя делай округление до нужной разрядности.
...
Рейтинг: 0 / 0
11.01.2018, 18:53
    #39582760
YP977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
White Owl,

Да вот не хотелось бы иметь головняк с таким поведением. Для денег, там я все храню в копейках и так далее.
Тут же количество товара. В общем случае будет три знака после запятой, т.е. все нужно будет умножать на 1000. А есть еще коэффициенты единиц измерения и там возможно тоже будут какие-то жуткие коэффициенты и умножать нужно будет на 100000 например.

Проще уж округлять при выполнении select-a.

А неожиданное хотя бы потому, что postgres посчитал 0. Лень проверять на всех доступных СУБД (точнее есть чем заняться и без этого), но есть подсознательная уверенность, что у всех других все таки будет 0. :)
...
Рейтинг: 0 / 0
11.01.2018, 18:55
    #39582761
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
Ноль или не ноль - зависит исключительно от формата вывода.
...
Рейтинг: 0 / 0
12.01.2018, 00:19
    #39582915
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
YP977А неожиданное хотя бы потому, что postgres посчитал 0. Лень проверять на всех доступных СУБД (точнее есть чем заняться и без этого), но есть подсознательная уверенность, что у всех других все таки будет 0. :)Нет, все базы считают с теми-же самыми погрешностями, они исходят из общей же проблемы конвертации базы счислений. Просто базы существуют не в вакууме, у них есть такая вещь как "стандартный управляющий клиент" :)
А вот как написан этот клиент и делает ли он неявное округление перед выводом результатов - это уже вопрос другой.
У большинства СУБД (особенно у тех которые имеют стандартные типы данных с фиксированной запятой) результаты расчетов при конвертации числа в строку принудительно приводятся к типу операндов. А для результатов с плавающей запятой обычно используется приведение к numeric(19,4) или numeric(19,6), с соответсвующими округлениями.
...
Рейтинг: 0 / 0
12.01.2018, 11:04
    #39583140
pit_alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
YP977 Есть ли какие-нибудь варианты имея такие данные получать правильное значение равное 0?

Код: sql
1.
select sum(quantity) + 1 - 1 from [front.rest_motion] where id_goods=3097;
...
Рейтинг: 0 / 0
12.01.2018, 11:48
    #39583189
YP977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
White OwlНет, все базы считают с теми-же самыми погрешностями, они исходят из общей же проблемы конвертации базы счислений. Просто базы существуют не в вакууме, у них есть такая вещь как "стандартный управляющий клиент" :)

Согласен. Не так выразился.


pit_alex
Код: sql
1.
select sum(quantity) + 1 - 1 from [front.rest_motion] where id_goods=3097;



Прикольное решение :) Спасибо.
...
Рейтинг: 0 / 0
12.01.2018, 12:54
    #39583254
pit_alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
YP977Прикольное решение :) Спасибо.

это не решение это костыль :)
...
Рейтинг: 0 / 0
12.01.2018, 15:17
    #39583349
YP977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite округление numeric
pit_alexэто не решение это костыль :)
Не спорю :)
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite округление numeric / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]