Модератор: Модераторы
function RoundDoubleDigit(Value: Double; Digit: Integer): Double;
var
Factor: Double;
begin
Factor := Exp(Digit * Ln(10));
if Value < 0 then
Result := Trunc(Value * Factor - 0.5) / Factor
else
Result := Trunc(Value * Factor + 0.5) / Factor;
end;
function BuhDoubleDigit(Value: Double; Digit: Integer): Double;
var
Factor: Double;
begin
Factor := Exp(Digit * Ln(10));
Value := Value * Factor;
Result := Round(Value) / Factor;
end;
alex_rain писал(а):BuhDoubleDigit
function RoundCurrency(value: currency): currency;
var
x, y: Double;
begin
x := int(value * 100);
y := Frac(value * 100);
if y >= 0.5 then
x := x + 1;
result := x / 100;
end;
Vadim писал(а):А если использовать тип Currency?
function RoundN(X: Double; CountDlim: SmallInt): Double;
var
delim: int64 =1;
cd: Byte;
td: Double;
begin
if CountDlim < 0 then Exit;
if CountDlim > 14 then cd := 15 else cd := CountDlim;
if cd > 0 then delim:= 10**cd;
td := X * delim;
if frac(td) < 0.5 then Result := trunc(td) / delim
else Result := ceil(td) / delim;
end;
VirtUX писал(а):а мне нужно 15 знаков
Не всегда округляет 5 в большую сторону! Как это побороть?
Но даже при этом раскладе 1.005 (при округлении до 2-х знаков) округляется в меньшую. 1 вместо 1.01
Банковское округление (англ. banker's rounding) — округление для этого случая происходит к ближайшему чётному. Это позволяет устранить систематическую ошибку округления при суммировании большого количества чисел. То есть, 2,5 → 2, 3,5 → 4.
rndround(x) = x-floor(x)<random ? ceil(x) : floor(x)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42