powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Числа с фиксированной десятичной точкой и многими знаками после точки
16 сообщений из 16, страница 1 из 1
Числа с фиксированной десятичной точкой и многими знаками после точки
    #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
Числа с фиксированной десятичной точкой и многими знаками после точки
    #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
Числа с фиксированной десятичной точкой и многими знаками после точки
    #40051652
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, и правда, dimitr. ISQL дает такой результат. А IBExpert - тот, который у меня выше. Значит, это IBExpert результат представляет неаккуратно. Ну, уже легче, спасибо. Но п. 2 остается с вопросом.

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


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

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

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

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

Dimitry Sibiryakov

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

Ну, в Дельфи есть currency = decimal(18,4) , но это очень куце, конечно. Поначалу его и использовал, и все работало, пока не выяснилось, что 4 знака - это очень мало для задачи.
...
Рейтинг: 0 / 0
Числа с фиксированной десятичной точкой и многими знаками после точки
    #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
Числа с фиксированной десятичной точкой и многими знаками после точки
    #40051768
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Дмитрий,

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



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

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

- Вжик.

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

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

- Вжжик.

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

- Вжжжииикк.

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

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

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

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


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

Здесь проблема с переполнением, а оно мне про токен какой-то говорит.
...
Рейтинг: 0 / 0
Числа с фиксированной десятичной точкой и многими знаками после точки
    #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
Числа с фиксированной десятичной точкой и многими знаками после точки
    #40052162
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

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

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

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

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


?

(полагаю тут нулей достаточно много)
...
Рейтинг: 0 / 0
Числа с фиксированной десятичной точкой и многими знаками после точки
    #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
Числа с фиксированной десятичной точкой и многими знаками после точки
    #40052202
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, жабисты свой JDBC уже запилили под 4.0
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Числа с фиксированной десятичной точкой и многими знаками после точки
    #40052320
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВсё таки RC на дворе, а ты же провайдер пишешь.
А под новые типы данных там пилить много надо.

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

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


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