Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Опять про округление  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 191
Доброго времени суток.

Помогите понять причину, на будущее?
Есть ПО с небольшими расчетами. Считаем в процедурах на сервере. Точность не для космических полетов, но нужна.
Когда-то перешел на rfunc, из-за его функции calcexpr - это при тестах решало проблему с округлением 0,5 (нормально считает, не думает, что 0.5 - это 0.49999999).
Сегодня натолкнулись на проблему в ROUND, и во встроенной функции, и в той, что в rfunc:

select round(226598.205, 2) from RDB$DATABASE

возвращает верно, 226598.21 ок

select calcexpr('79562.7'||' + ('||coalesce(285.7, 0)||' * '||coalesce(514.65, 0)||')', '') from RDB$DATABASE

226598.205 - да, все ок, так и выходит

но если объединить:
select round(calcexpr('79562.7'||' + ('||coalesce(285.7, 0)||' * '||coalesce(514.65, 0)||')', ''), 2) from RDB$DATABASE

- т.е., вычислить это значение, и сразу округлить, то почему-то, возвращает 226598.20, а не 226598.21 ((

Обрамил calcexpr cast as Numeric(18,10) - начало считать правильно. Но почему сразу то не считает, ведь поэтапные проверки - все расчеты верные. И что-то мне подсказывает, что неправильно так делать. Или правильно?

Спасибо!
5 окт 17, 11:36    [20844719]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 247
Devillio,
А calcexpr это самописная хранимка? У выходного параметра какой тип?
5 окт 17, 12:55    [20845119]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 191
KreatorXXI,
DECLARE EXTERNAL FUNCTION CALCEXPR
CSTRING(16383),
CSTRING(16383)
RETURNS DOUBLE PRECISION BY VALUE

это функция из готовой библиотеки rFunc
5 окт 17, 13:23    [20845207]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7276
Devillio,

потому что RETURNS DOUBLE PRECISION BY VALUE
5 окт 17, 13:27    [20845224]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 247
Симонов Денис,

Ну и что? В описании round сказано, что возвратить может и BIGINT. Devillio, версия FB? Может в этом дело?
5 окт 17, 14:24    [20845451]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 191
KreatorXXI,
так происходит на 2.5 и на 3.0
5 окт 17, 14:29    [20845467]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7276
KreatorXXI,

Devillio
226598.205 - да, все ок, так и выходит


потому что сам вывод уже округлённый (IBE округляет при отображении в гриде)
5 окт 17, 14:37    [20845505]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 191
Симонов Денис, да, спасибо. И правда, результат 226598,204999999958...
Блин! Да как считать-то ))))
Правильно везде cast с нужной точностью впихивать?
5 окт 17, 14:53    [20845564]     Ответить | Цитировать Сообщить модератору
 Re: Опять про округление  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43636

Devillio
Правильно везде cast с нужной точностью впихивать?

Не везде, а только там, где он требуется по бизнес-логике. Это если она вообще не требует
точных расчётов.

Posted via ActualForum NNTP Server 1.5

5 окт 17, 15:00    [20845590]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить