powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Арифметика фиксированной точки
4 сообщений из 4, страница 1 из 1
Арифметика фиксированной точки
    #40052642
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SQL> select cast( 1 as decimal(18,8) ) * cast( 1 as decimal(18,8) ) from rdb$database;

             MULTIPLY
=====================
   1.0000000000000000


Код: sql
1.
2.
3.
4.
5.
SQL> select cast( 1 as decimal(18,9) ) * cast( 1 as decimal(18,9) ) from rdb$database;

             MULTIPLY
=====================
 1.000000000000000000


Код: sql
1.
2.
3.
4.
5.
6.
SQL> select cast( 1 as decimal(18,10) ) * cast( 1 as decimal(18,10) ) from rdb$database;

             MULTIPLY
=====================
Statement failed, SQLSTATE = 22003
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.



Вот вам и шведская пила. Получается, что если умножить число decimal(n,x) на decimal(n,y) , в результате будет вдруг decimal(n,x+y) . Практический вывод - умножать числа с фиксированной точкой нельзя, даже на 1 , ибо облом случится не быстро, а очень быстро.

Не готов утверждать, что это неправильно, но весьма неожиданно и неприятно.

Firebird 3.0.7

Кстати, в документации по серверу эта особенность арифметических операций над числами с фиксированной точкой не описана.
...
Рейтинг: 0 / 0
Арифметика фиксированной точки
    #40052645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyПолучается, что если умножить число *decimal(n,x)* на *decimal(n,y)*, в результате будет
вдруг *decimal(n,x+y)*.

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

описана.

shalamyanskyПолучается, что если умножить число decimal(n,x) на decimal(n,y), в результате будет вдруг decimal(n,x+y).

На самом деле decimal(m, x+y) , где m >= n и m - следующий по вместимости целочисленный тип. Просто в 3.0 максимально можно вместить 18 знаков (bigint).

В 4.0 например ты получишь decimal(38, 20) (int128 во внутреннем представлении)
...
Рейтинг: 0 / 0
Арифметика фиксированной точки
    #40052655
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

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


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