powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про округление
9 сообщений из 9, страница 1 из 1
Опять про округление
    #39531336
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

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

Код: sql
1.
select round(226598.205, 2) from RDB$DATABASE


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

Код: sql
1.
select calcexpr('79562.7'||' + ('||coalesce(285.7, 0)||' * '||coalesce(514.65, 0)||')', '') from RDB$DATABASE


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

но если объединить:
Код: sql
1.
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) - начало считать правильно. Но почему сразу то не считает, ведь поэтапные проверки - все расчеты верные. И что-то мне подсказывает, что неправильно так делать. Или правильно?

Спасибо!
...
Рейтинг: 0 / 0
Опять про округление
    #39531420
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,
А calcexpr это самописная хранимка? У выходного параметра какой тип?
...
Рейтинг: 0 / 0
Опять про округление
    #39531440
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI,
DECLARE EXTERNAL FUNCTION CALCEXPR
CSTRING(16383),
CSTRING(16383)
RETURNS DOUBLE PRECISION BY VALUE

это функция из готовой библиотеки rFunc
...
Рейтинг: 0 / 0
Опять про округление
    #39531445
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

потому что RETURNS DOUBLE PRECISION BY VALUE
...
Рейтинг: 0 / 0
Опять про округление
    #39531495
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Ну и что? В описании round сказано, что возвратить может и BIGINT. Devillio, версия FB? Может в этом дело?
...
Рейтинг: 0 / 0
Опять про округление
    #39531499
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI,
так происходит на 2.5 и на 3.0
...
Рейтинг: 0 / 0
Опять про округление
    #39531512
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Devillio226598.205 - да, все ок, так и выходит

потому что сам вывод уже округлённый (IBE округляет при отображении в гриде)
...
Рейтинг: 0 / 0
Опять про округление
    #39531527
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, да, спасибо. И правда, результат 226598,204999999958...
Блин! Да как считать-то ))))
Правильно везде cast с нужной точностью впихивать?
...
Рейтинг: 0 / 0
Опять про округление
    #39531539
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioПравильно везде cast с нужной точностью впихивать?

Не везде, а только там, где он требуется по бизнес-логике. Это если она вообще не требует
точных расчётов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять про округление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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