Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с делением/умножением типов Decimal в DB2 / 13 сообщений из 13, страница 1 из 1
12.07.2011, 10:53
    #37347433
K.T.V.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Доброго времени суток!
Не понимаю, что происходит с числами типа Decimal при их делении и умножении в DB2.
К примеру, если взять функцию
CREATE FUNCTION MY_FUNC_FOR_TEST (PARAM1 DECIMAL(19,4),
PARAM2 DECIMAL(19,4))
RETURNS DECIMAL(19,4)
BEGIN
RETURN PARAM1*PARAM2;
END

и вызвать ее с произвольными дробными числами, то результат будет ужасающе далек от реального. А вот если выполнять не просто умножение, а указывать точность для каждого параметра, причем со scale=8:
RETURN DEC(DEC(PARAM1,19,8)*DEC(PARAM2,19,8),19,4);
то все получается просто отлично.
Почему на ДБ2 оно работает именно так?
...
Рейтинг: 0 / 0
12.07.2011, 11:24
    #37347518
xz321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Версия?
...
Рейтинг: 0 / 0
12.07.2011, 11:25
    #37347520
Dr. Blez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
db2 10 for z/os
...
Рейтинг: 0 / 0
12.07.2011, 13:31
    #37347793
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Искажение в положении десятичной точки в результате?
Т.е. вместо 123,45 например что-то типа 12,345
...
Рейтинг: 0 / 0
12.07.2011, 13:58
    #37347849
Dr. Blez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Код: plaintext
1.
2.
3.
4.
CREATE PROCEDURE TEST.TSTDEC(IN V1 DECIMAL( 19 , 4 ), IN V2 DECIMAL( 19 , 4 ), OUT R DECIMAL( 19 , 4 ))
P1: BEGIN 
 SET R = V1 * V2;
END P1
получается:

v1=19.4122
v2=22.5123
r=427.0684
...
Рейтинг: 0 / 0
12.07.2011, 13:59
    #37347851
Dr. Blez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
а должно быть 437,0133
...
Рейтинг: 0 / 0
12.07.2011, 14:39
    #37347971
xz321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Используйте DECFLOAT
...
Рейтинг: 0 / 0
12.07.2011, 14:48
    #37347996
K.T.V.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Да, большое спасибо! Умные люди уже даже скинули ссылку на статью, где говорится, что в ДБ2 можно использовать этот тип для финансовых вычислений :) http://www.ibm.com/developerworks/data/library/techarticle/dm-0801chainani/
...
Рейтинг: 0 / 0
13.07.2011, 00:23
    #37348971
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
вообще странно, а почему обычный децимал не работает правильно?
...
Рейтинг: 0 / 0
13.07.2011, 08:23
    #37349092
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
v1=19.4122
v2=22.5123

r=427.0684 - это результат умножения 19.4122 на 22, т.е. похоже от множителя только целая часть берется.
...
Рейтинг: 0 / 0
13.07.2011, 10:48
    #37349300
K.T.V.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Так вот непонятно, почему оно так работает! Может быть, что-то не то с настройками самого сервера? Сейчас специалисты будут переписываться с IBM'овцами, выяснять...
...
Рейтинг: 0 / 0
13.07.2011, 12:52
    #37349550
Проблема с делением/умножением типов Decimal в DB2
K.T.V.,

Исполнение умножения в таком виде должно давать SQLWARN7 (Conversion of decimal number from precision 31 to precision 15 caused truncation of fractional digits.)
Почему так происходит описано в документации: Decimal multiplication
Т.е. умножение работает "AS DESIGNED" но неочевидным образом.
Варианты решения:
1. Уменьшить заданную разрядность одного из операндов с 19,4 до 15,4
2. Применить функцию MULTIPLY_ALT. Внимательно смотреть как работает.
3. Использовать DECFLOAT, о чем уже сказано.
...
Рейтинг: 0 / 0
15.07.2011, 10:37
    #37353065
K.T.V.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с делением/умножением типов Decimal в DB2
Ага, тогда понятно. Спасибо!
Вариант 15,4 уже предлагался - решили, что для наших условий слишком мало.
функцию посмотрю.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с делением/умножением типов Decimal в DB2 / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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