Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
Люди, привет.....
В общем ситуация: есть поля типа decimal(20,2), в которых хранится денежная информация(рубли, копейки). Дальше требуется произвести с этими полями математические действия, чаще всего деление, а результат сохранить в поле с таким же типом(decimal(20,2)). Вот тут-то все и начинается... В общем проблема с округлением, иногда последний разряд делает -0,01. Нужен практический совет, кто как борется?
23 окт 06, 16:06    [3297159]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
warIord
Member

Откуда:
Сообщений: 207
может попробовать математические операции переопределить и в них фракции отдельно обрабатывать
23 окт 06, 16:26    [3297361]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Привет.

Сравните
select decimal(v, 10, 2), decimal(round(v, 2), 10, 2)
from (
select decimal(1.236, 10, 3) v
from sysibm.sysdummy1
) t;
Когда вы просто приводите к decimal(m, n), то все знаки после запятой свыше n просто отбрасываются.
23 окт 06, 16:38    [3297500]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
Не все так просто...

------------------------------------------------------------------------------
declare global temporary table test (val_1 decimal(20,2), val_2 double, val_3 double) with replace on commit preserve rows not logged in user_tmp
DB20000I Команда SQL выполнена успешно.

insert into session.test (val_1, val_2, val_3) values (decimal(sysfun.round(2422.2*10/1200,2),20,2),sysfun.round(2422.2*10/1200,2),sysfun.round(2422.2*10/1200,3))
DB20000I Команда SQL выполнена успешно.

select * from session.test

VAL_1 VAL_2 VAL_3
---------------------- ------------------------ ------------------------
20,18 +2,01800000000000E+001 +2,01850000000000E+001

1 записей выбрано.
23 окт 06, 21:49    [3298870]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
похоже проблема с sysfun.round?
23 окт 06, 21:52    [3298877]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
TORT
похоже проблема с sysfun.round?
Может быть.
Только я писал о sysibm.round, а не о sysfun.round.
Сравните:
values (
  decimal(sysibm.round(2422.2*10/1200,2),20,2)
, decimal(sysfun.round(2422.2*10/1200,2),20,2)
);
24 окт 06, 09:38    [3299761]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
Не внимательно посмотрел... Хм... Действительно sysibm.round работает корректно... Спасибо за совет... Думаю тема закрыта....
24 окт 06, 09:50    [3299825]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
сорри... "Невнимательно" слитно пишется....
24 окт 06, 11:11    [3300425]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
Ну вот опять( Нельзя людям верить....

------------------------------ Введенные команды ------------------------------
VALUES(SYSIBM.ROUND(DOUBLE(1633)/DOUBLE(11),2));
VALUES(SYSIBM.ROUND(DOUBLE(1633)/DOUBLE(11),3));
------------------------------------------------------------------------------
VALUES(SYSIBM.ROUND(DOUBLE(1633)/DOUBLE(11),2))

1
------------------------
+1,48450000000000E+002

1 записей выбрано.


VALUES(SYSIBM.ROUND(DOUBLE(1633)/DOUBLE(11),3))

1
------------------------
+1,48455000000000E+002

1 записей выбрано.
9 фев 07, 09:43    [3759659]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
И что?
Все правильно.
Округление до n цифр после запятой производится не по результатам округления до n+1 цифры, а только по одной n+1 цифре.
Иначе пришлось бы залезать до самой последней значащей цифры вправо для выявления таких случаев, как "0,4444........................5".
Может быть, где-то так и происходит, но не в db2.
9 фев 07, 10:11    [3759847]     Ответить | Цитировать Сообщить модератору
 Re: Округление... Нужен совет...  [new]
TORT
Member

Откуда:
Сообщений: 1095
Я и говорю... Наивный человек....
9 фев 07, 11:56    [3760710]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить