Функции g_m_round, g_m_roundnn были добавлены в GUDF.DLL когда в FB отсутствовали встроенные аналоги и с их использованием могут возникнуть проблемы. В стандартных ПИ мы заменили эти функции на вызов встроенной ROUND. В частных решениях это несомненно стоит проделать.
G_M_ROUND
Как отмечено здесь при аргументе больше 2 млрд меняется знак. Причина в типе результата -- INTEGER. Исправить проблематично, так как надо менять и GUDF.DLL, и объявление функции в БД. Из своего опыта мы знаем насколько живучи старые версии DLL, которые способны возникать буквально из ниоткуда, пробираться на самые критичные сервера и проявляться в самые неожиданные моменты.
Замена тривиальна: G_M_ROUND(X) -> ROUND(X)
G_M_ROUNDNN
При использовании возможна потеря точности, так как результат имеет тип DOUBLE PRECISION.
Замена:
g_m_roundnn(X, Y)
->
ROUND(X, IIF((Y = 0) OR (Y = 1), 0, - LOG(10, ABS(Y))))
Такая сложная замена нужна только в существующем коде, чтобы не трогать определение и значение параметра разрядности. У нас задается 0.01, если необходимо округление до сотых, 0.1 -- до десятых, 10 -- до десятков и т.п. Во встроенной функции ROUND второй параметр это целое число. Положительные значения определяют количество десятичных знаков для округления, а отрицательные -- кратность оругленной суммы соответствующей степени 10. Напрмер, ROUND(8153, -3) вернет 8000.
Комментариев нет:
Отправить комментарий