powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Функции left, right и банковское округление
14 сообщений из 14, страница 1 из 1
Функции left, right и банковское округление
    #38446783
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаю страницу с офсайта про функцию Left http://www.firebirdsql.org/refdocs/langrefupd25-intfunc-left.html
Там следующее:
авторIf the length argument is not a whole number, bankers' rounding (round-to-even) is applied, i.e. 0.5 becomes 0, 1.5 becomes 2, 2.5 becomes 2, 3.5 becomes 4, etc.

Т.е. округление аргумента length банковское (до ближайшего целого).
Начинаю проверять:
Код: sql
1.
select left('123', 0.5) from rdb$database


Результат: '1'
Хотя ожидаю пустую строку.

Затем
Код: sql
1.
select left('123', 2.5) from rdb$database


Результат: '123'
Хотя по заявлению в документации "2.5 becomes 2" и результат должен быть '12'
Версия FB: 2.5.2.26540
У меня ошибка в рассуждениях или писать в трекер?
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38446820
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описка
авторТ.е. округление аргумента length банковское (до ближайшего целого).
Читать как:
Т.е. округление аргумента length банковское (до ближайшего четного).
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38446827
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFF:
Видимо я чего-то не понимаю в этой жизни. Но какого ... придумывать банковское округление длины запрашиваемого результата? Тот, кто писал эту SDF какой бизнес-кейс в голове держал для этого случая?
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38446853
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сдаётся мне, это чья-то отсебятина в "Firebird 2.5 Language Reference Update"
В оригинальном README.builtin_functions.txt об этом нет ни слова.
В коде второй аргумент вычисляется как обычное число и нет никаких специальных действий над результатом вычислений.
Отсюда следует, что литерал 0.5 будет преобразован в целое число согласно правилам текущего диалекта БД.

PS я не понимаю - назачем пихать не целые аргументы в LEFT ???
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38446897
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

я тоже удивлен, зачем пихать банковское округление в аргумент, да и вообще, зачем туда принимать числа с дробями.
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38447677
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне было бы все-равно... Только понадобилось банковское округление, которого в виде функции в FB нет. Нагуглил только UDF и в мануале по FB в этих функциях. Дай думаю проверю, а тут такое :)
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38447700
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подсмотрел у ораклоидов функцию банковского округления
http://www.tek-tips.com/viewthread.cfm?qid=1487672

Перевел в FB, вдруг кому пригодится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or alter procedure bankers_round (
    val double precision,
    rnd_digit integer)
returns (
    res double precision)
as
declare variable v_rnd_digit integer;
declare variable v_remainder integer;
begin
  v_rnd_digit = trunc(rnd_digit);
  v_remainder = (val - trunc(val, v_rnd_digit)) * power(10, v_rnd_digit + 1);
  if (abs(v_remainder) < 5 or abs(v_remainder) = 5 and
      mod(trunc(val * power(10, v_rnd_digit)), 2) = 0) then
    res = trunc(val, v_rnd_digit);
  else
    res = round(val, v_rnd_digit);
  suspend;
end
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38447835
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое еще округление, если у тебя результат double, т.е. не точный ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38483453
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сисдба Мастеркеевич,

Второй параметр rnd_digit это разряд после запятой, до которого округлять и результат при rnd_digit>0 вещественное число, округленное до rnd_digit разрядов. Сможешь написать лучше, велкам.
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38483462
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AtanasСисдба Мастеркеевич,

Второй параметр rnd_digit это разряд после запятой, до которого округлять и результат при rnd_digit>0 вещественное число, округленное до rnd_digit разрядов. Сможешь написать лучше, велкам.

Намек то был про то что Double - это число с плавающей точкой
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38483465
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m,

Намек я понял. Но динамически стряпать на выходе decimal с нужной точностью, в зависимости от rnd_digit, тоже возможности нет.
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38487549
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atanas,

Decimal пофигу, что ты там стряпаешь про его точность, и он всё равно будет полный.
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38515881
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery,

Процедура ведь небольшая. Ну и поправили бы. Нет, все будут тыкать в double precision, а сделать лучше ни один не взялся.
...
Рейтинг: 0 / 0
Функции left, right и банковское округление
    #38515925
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AtanasПроцедура ведь небольшая. Ну и поправили бы. Нет, все будут тыкать в double precision, а сделать лучше ни один не взялся.Кому надо, тот делает, либо оплачивает работу. Давай внятное ТЗ, размер компенсации, полагаю желающие найдутся, чтоб лучше искались могу отправить топик в "работу".

Ваня Сусанина я знаю теперьДа про тебя тоже уже все знают, тоже мне сакральное знание.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Функции left, right и банковское округление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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