Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  364

•  TDictionary Custom Sort  3 500

•  Fast Watermark Sources  3 246

•  3D Designer  5 008

•  Sik Screen Capture  3 498

•  Patch Maker  3 703

•  Айболит (remote control)  3 906

•  ListBox Drag & Drop  3 166

•  Доска для игры Реверси  82 929

•  Графические эффекты  4 104

•  Рисование по маске  3 397

•  Перетаскивание изображений  2 769

•  Canvas Drawing  2 920

•  Рисование Луны  2 725

•  Поворот изображения  2 340

•  Рисование стержней  2 228

•  Paint on Shape  1 627

•  Генератор кроссвордов  2 311

•  Головоломка Paletto  1 824

•  Теорема Монжа об окружностях  2 330

•  Пазл Numbrix  1 720

•  Заборы и коммивояжеры  2 094

•  Игра HIP  1 315

•  Игра Go (Го)  1 263

•  Симулятор лифта  1 512

•  Программа укладки плитки  1 259

•  Генератор лабиринта  1 585

•  Проверка числового ввода  1 404

•  HEX View  1 539

•  Физический маятник  1 389

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Как научить 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 Magazine

Tetris DelphiX

Quake Delphi Sources

Delphi MMOG

 

Delphi Яндекс Директ

Delphi to HTML Converter

Проверка знаний Delphi

Is Delphi Dying Monitor

 

Autosave Delphi 7




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте