powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Округление... Нужен совет...
11 сообщений из 11, страница 1 из 1
Округление... Нужен совет...
    #34074506
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди, привет.....
В общем ситуация: есть поля типа decimal(20,2), в которых хранится денежная информация(рубли, копейки). Дальше требуется произвести с этими полями математические действия, чаще всего деление, а результат сохранить в поле с таким же типом(decimal(20,2)). Вот тут-то все и начинается... В общем проблема с округлением, иногда последний разряд делает -0,01. Нужен практический совет, кто как борется?
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34074599
warIord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может попробовать математические операции переопределить и в них фракции отдельно обрабатывать
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34074655
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Сравните
Код: plaintext
1.
2.
3.
4.
5.
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 просто отбрасываются.
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34075376
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не все так просто...

------------------------------------------------------------------------------
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 записей выбрано.
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34075381
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже проблема с sysfun.round?
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34075863
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTпохоже проблема с sysfun.round?Может быть.
Только я писал о sysibm.round, а не о sysfun.round.
Сравните:
Код: plaintext
1.
2.
3.
values (
  decimal(sysibm.round( 2422 . 2 * 10 / 1200 , 2 ), 20 , 2 )
, decimal(sysfun.round( 2422 . 2 * 10 / 1200 , 2 ), 20 , 2 )
);
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34075897
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не внимательно посмотрел... Хм... Действительно sysibm.round работает корректно... Спасибо за совет... Думаю тема закрыта....
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34076234
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри... "Невнимательно" слитно пишется....
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34317920
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот опять( Нельзя людям верить....

------------------------------ Введенные команды ------------------------------
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 записей выбрано.
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34318003
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что?
Все правильно.
Округление до n цифр после запятой производится не по результатам округления до n+1 цифры, а только по одной n+1 цифре.
Иначе пришлось бы залезать до самой последней значащей цифры вправо для выявления таких случаев, как "0,4444........................5".
Может быть, где-то так и происходит, но не в db2.
...
Рейтинг: 0 / 0
Округление... Нужен совет...
    #34318477
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я и говорю... Наивный человек....
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Округление... Нужен совет...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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