Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Числа с фиксированной десятичной точкой и многими знаками после точки / 16 сообщений из 16, страница 1 из 1
08.03.2021, 15:53
    #40051642
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
1.
Код: sql
1.
2.
cast( 99.00000000000001 as decimal(18,14) ) = 99.00000000000003
cast( 99.00000000000003 as decimal(18,14) ) = 99.00000000000004


Наблюдается дребезг в 14-м и далее разрядах, характерный для преобразований чисел с плавающей точкой. С чего бы? Специально выбрал формат с фиксированной точкой, чтобы не терять ни одного знака, и вот. Это пока не вопрос, так, недоумение.

2. А вот и вопрос. Хочу хранить в поле таблицы величины decimal(18,14) и получать их с клиента, но не могу сообразить, как бы эту передачу толком сделать.

Передавать в виде floating point нельзя, будут искажения. Если передавать как bigint , то потом невозможно поделить на 100000000000000 , это число в выражении явно или неявно преобразуется к decimal(18,14) и возникает overflow . Да и есть сильные подозрения, что при делении не обойдется без floating point (см. п. 1), что опять приведет к потере разрядов.

Единственное, что остается, передавать в виде строки '99.00000000000001' и потом делать cast к decimal(18,14) , но это ж как-то некошерно работать с числами через строки. А как? Ладно, хотя бы к decimal(18,13) , на 13 знаках хотя бы явления, описанного в п. 1, не наблюдается.

Firebird 3.0.7

P.S.
Да, и с праздником всех причастных!
...
Рейтинг: 0 / 0
08.03.2021, 16:06
    #40051645
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Код: sql
1.
2.
3.
4.
5.
SQL> select cast( 99.00000000000001 as decimal(18,14) ) from rdb$database;

                 CAST 
===================== 
    99.00000000000001 
...
Рейтинг: 0 / 0
08.03.2021, 16:28
    #40051652
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Хм, и правда, dimitr. ISQL дает такой результат. А IBExpert - тот, который у меня выше. Значит, это IBExpert результат представляет неаккуратно. Ну, уже легче, спасибо. Но п. 2 остается с вопросом.

Ага, точно
Код: sql
1.
cast( cast( 99.00000000000001 as decimal(18,14) ) as varchar(20) ) = '99.00000000000001'
...
Рейтинг: 0 / 0
08.03.2021, 18:55
    #40051674
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
shalamyansky
Если передавать как bigint , то потом невозможно поделить на 100000000000000 , это число в выражении явно или неявно преобразуется к decimal(18,14) и возникает overflow . Да и есть сильные подозрения, что при делении не обойдется без floating point (см. п. 1), что опять приведет к потере разрядов.


А зачем делить на 100000000000000, если можно умножить на 0.000000000000001.
...
Рейтинг: 0 / 0
08.03.2021, 19:27
    #40051681
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
shalamyanskyЗначит, это IBExpert результат представляет неаккуратно.

Потому что Дельфи вообще и дельфийские компоненты доступа к данным не имеют типа с
фиксированной точкой. Так что либо используй API напрямую, либо извращайся
проктостоматологически.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.03.2021, 22:24
    #40051695
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
YuRock

А зачем делить на 100000000000000, если можно умножить на 0.000000000000001.

Мн-да... знал, что я лопух, но чтоб настолько... Работает, однако, спасибо!

Dimitry Sibiryakov

Потому что Дельфи вообще и дельфийские компоненты доступа к данным не имеют типа с фиксированной точкой. Так что либо используй API напрямую, либо извращайся проктостоматологически.

Ну, в Дельфи есть currency = decimal(18,4) , но это очень куце, конечно. Поначалу его и использовал, и все работало, пока не выяснилось, что 4 знака - это очень мало для задачи.
...
Рейтинг: 0 / 0
09.03.2021, 09:27
    #40051765
Коваленко Дмитрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
dimitr
Код: sql
1.
2.
3.
4.
5.
SQL> select cast( 99.00000000000001 as decimal(18,14) ) from rdb$database;

                 CAST 
===================== 
    99.00000000000001 



FB3, D3.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> select cast(9.00000000000001 as decimal(18,14) ) from rdb$database;

                 CAST
=====================
     9.00000000000001

SQL> select cast(90.00000000000001 as decimal(18,14) ) from rdb$database;

                 CAST
=====================
    90.00000000000001

SQL> select cast(90000.00000000000001 as decimal(18,14) ) from rdb$database;

                 CAST
=====================
 90000.00000000000001

SQL> select cast(90000000000.00000000000001 as decimal(18,14) ) from rdb$database;
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, column 13
-9


Навеяло
...
Рейтинг: 0 / 0
09.03.2021, 09:38
    #40051768
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Коваленко Дмитрий,

а что тут удивило, если ты 19 знаков передал?
...
Рейтинг: 0 / 0
09.03.2021, 13:44
    #40051898
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Симонов Денис,



Смонтировали на лесопилке в сердце Сибири импортную шведскую пилораму.

- Ну-ко, Васька, тащи бревно.

- Вжик.

- Уууу, сцуко...

- Мужики, тащите самое толстое.

- Вжжик.

- Уууу сцуко... Так, тащите колоду на которой дрова колем.

- Вжжжииикк.

- Уууу сцуко... Васька, сунь-ка в её лом.

- Дзынь-блям-чик-чирик-звездык-куку.

- Аааа, сцуко!
...
Рейтинг: 0 / 0
10.03.2021, 08:57
    #40052151
Коваленко Дмитрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Симонов Денис
Коваленко Дмитрий,

а что тут удивило, если ты 19 знаков передал?


Сообщение об ошибке.

Здесь проблема с переполнением, а оно мне про токен какой-то говорит.
...
Рейтинг: 0 / 0
10.03.2021, 09:42
    #40052159
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Коваленко Дмитрий,

чтобы была ошибка о переполнении парсер должен сначала получить число в одном из известных Firebird типов, а только потом делать преобразование, где и может вылезти эта ошибка

Попробуй на Firebird 4.0

Код: sql
1.
2.
select cast(90000000000.00000000000001 as decimal(18,14) )
from rdb$database;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -802
SQLSTATE: 22003
GDSCODE: 335544321

Код: sql
1.
2.
select cast(90000000000.00000000000001 as decimal(38,14) )
from rdb$database;



а вот тут всё OK
...
Рейтинг: 0 / 0
10.03.2021, 09:49
    #40052162
Коваленко Дмитрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Симонов Денис

Попробуй на Firebird 4.0

У меня его нет.

А что он там скажет про

Код: plsql
1.
cast(900000000000000000000000000000000000000000000000000000000000000000000000000.00000000000001 as decimal(38,14) )


?

(полагаю тут нулей достаточно много)
...
Рейтинг: 0 / 0
10.03.2021, 09:58
    #40052166
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Коваленко Дмитрий,

Код: plaintext
1.
2.
3.
4.
5.
6.
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
numeric value is out of range.
-------------------------------------------------------------
SQLCODE: -802
SQLSTATE: 22003
GDSCODE: 335544321

а там такой литерал распознаётся как decfloat(34) которое при преобразовании в decimal и даёт ошибку

Коваленко ДмитрийУ меня его нет.

А пора бы уже иметь. Всё таки RC на дворе, а ты же провайдер пишешь.
А под новые типы данных там пилить много надо.
...
Рейтинг: 0 / 0
10.03.2021, 11:38
    #40052202
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
кстати, жабисты свой JDBC уже запилили под 4.0
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 14:40
    #40052320
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Симонов ДенисВсё таки RC на дворе, а ты же провайдер пишешь.
А под новые типы данных там пилить много надо.

Не надо. MS SQL и, соответственно, OLE DB не имеют поддержки этих типов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 15:07
    #40052328
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числа с фиксированной десятичной точкой и многими знаками после точки
Dimitry Sibiryakov,

а дата/время с часовыми поясами? Они там вроде давно.
MSSQL точно не знает decfloat, а вот numeric(38, x) там вроде давно есть
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Числа с фиксированной десятичной точкой и многими знаками после точки / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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