Модератор: Модераторы
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)Сейчас этот форум просматривают: Yandex [Bot] и гости: 1