В общем, по поводу банковского округления, гуглил, и кроме вопроса "как реализовать" от множества людей ничего не нагуглил.
может пригодится кому
Арифметическое округления:
- Код: Выделить всё
function aRound(X: ValReal; Precision: Integer): ValReal;
var
i, ii : ValReal;
begin
i := Frac(X)*Precision;
ii := Frac(i);
i := Int(i);
if ii >= 0.5 then i := i + 1;
if ii <= -0.5 then i := i - 1;
aRound := Int(X) + i/Precision;
end;
Банковское округление:
- Код: Выделить всё
function bRound(X: ValReal): ValReal;
var
i, ii: ValReal;
b: integer;
begin
i := Frac(X)*100;
ii := Frac(i);
i := Int(i);
if (ii >=0.5) and (ii < 0.6) then
begin
b:=StrToInt(Copy(floatToStr(frac(x)),4, 1));
if (b and 1) = 0 then i := i else i := i + 1 ;
Result := Int(X) + i/100;
end else
begin
Result := around(x,100);
end;
end;
Если кто то решит поправить буду только рад.
Интересная статья "Загадки округления" Если бы бухгалтер был магом и чародеем, он несомненно решил бы проблему так, чтобы какой-нибудь саблезубый тигр откусил руку, или хотя бы нечетное количество пальцев нашему волосатому пращуру, придумавшему десятичную систему счисления, чтобы в ней не осталось "середины". Но он выкрутился хитрее - половину отбрасываемых пятерок стал округлять вверх, а половину - вниз. Чтобы его не обвинили в личных пристрастиях, критерием стала цифра перед пятеркой - если она четная, то округление вниз, иначе вверх. Это правило и называется правилом "Бухгалтерского" (или "Банковского") округления.
Добавлено спустя 2 минуты 29 секунд:IsmСпасибо! Завтра буду ломать голову дальше в чем именно причина.
Ism писал(а):у меня 32 битная система
У меня тоже, завтра еще если времени хватит попробую на других платформах.