Это так называемое банковское округление - вариант округления к ближайшему целому,
в котором добавлено дополнительное правило: если дробная часть равна 0,5,
округление происходит к ближайшему чётному.
А еще зачем то результат ROUND приводится к INTEGER. Из за чего суммы больше 2-х миллиардов не округляет. См. ответствующий фрагмент кода в файле fs_isysrtti.pas
function TfsSysFunctions.CallMethod6(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
begin
if MethodName = 'ROUND' then
Result := Integer(Round(Caller.Params[0]))
else if MethodName = 'TRUNC' then
Result := Integer(Trunc(Caller.Params[0]))
А еще зачем то результат ROUND приводится к INTEGER. Из за чего суммы больше 2-х миллиардов не округляет. См. ответствующий фрагмент кода в файле fs_isysrtti.pas
Т.к. фактически скрипт не поддерживает int64, можно конечно объявить переменную как вариант. Но в остальных случаях будет вызывать переполнение.
Округлением можно управлять через SetRoundMode или напрямую через Set8087CW.
Комментарии
в котором добавлено дополнительное правило: если дробная часть равна 0,5,
округление происходит к ближайшему чётному.
Нам пришлось INTEGER убрать.
Т.к. фактически скрипт не поддерживает int64, можно конечно объявить переменную как вариант. Но в остальных случаях будет вызывать переполнение.
Округлением можно управлять через SetRoundMode или напрямую через Set8087CW.
Засада. Завтра перепроверю.