Delphi World - Как научить Delphi делать правильное округление дробных чисел
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как научить Delphi делать правильное округление дробных чисел

Автор: Lonely Wanderer

Чем отличается законченный программист от простого пользователя? Пользователь думает, что в килобайте 1000 байт, а Программист думает, что в километре 1024 метра.


function RoundStr(Zn: Real; kol_zn: Integer): Real;
var
  snl, s, s0, s1, s2: string;
  n, n1: Real;
  nn, i: Integer;
begin
  s := FloatToStr(Zn);
  if (Pos(',', s) > 0) and (Zn > 0) and
  (Length(Copy(s, Pos(',', s) + 1, length(s))) > kol_zn) then
  begin
    s0 := Copy(s, 1, Pos(',', s) + kol_zn - 1);
    s1 := Copy(s, 1, Pos(',', s) + kol_zn + 2);
    s2 := Copy(s1, Pos(',', s1) + kol_zn, Length(s1));
    n := StrToInt(s2) / 100;
    nn := Round(n);
    if nn >= 10 then
    begin
      snl := '0,';
      for i := 1 to kol_zn - 1 do
        snl := snl + '0';
      snl := snl + '1';
      n1 := StrToFloat(Copy(s, 1, Pos(',', s) + kol_zn)) + StrToFloat(snl);
      s := FloatToStr(n1);
      if Pos(',', s) > 0 then
        s1 := Copy(s, 1, Pos(',', s) + kol_zn);
    end
    else
      s1 := s0 + IntToStr(nn);
    if s1[Length(s1)] = ',' then
      s1 := s1 + '0';
    Result := StrToFloat(s1);
  end
  else
    Result := Zn;
end;

или


function RoundEx(X: Double; Precision: Integer ): Double;
{
Precision :
1 - до целых
10 - до десятых
100 - до сотых
...
}
var
  ScaledFractPart, Temp: Double;
begin
  ScaledFractPart := Frac(X) * Precision;
  Temp := Frac(ScaledFractPart);
  ScaledFractPart := Int(ScaledFractPart);
  if Temp >= 0.5 then
    ScaledFractPart := ScaledFractPart + 1;
  if Temp <= -0.5 then
    ScaledFractPart := ScaledFractPart - 1;
  RoundEx := Int(X) + ScaledFractPart / Precision;
end;

Еще более короткий способ:

Округление дробных чисел с точностью i - количество знаков после запятой, S - дробное число в строковом виде.

function FormatData(s: String; i: Integer): String;
begin
  Result:=FloatToStr(Round(StrToFloat(s)*exp(i*ln(10)))/(exp(i*ln(10))));
end;
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования