powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite округление numeric
9 сообщений из 9, страница 1 из 1
Sqlite округление numeric
    #39582687
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Работаю на 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
Sqlite округление numeric
    #39582754
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YP977Про запись числа double знаю, но блин такое поведение крайне неожиданное.

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

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

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

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

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

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

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


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



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

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


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