Округление чисел

Previous  Top  Next

    
 

 

Code:

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;

 

©Drkb::04074

http://delphiworld.narod.ru/

DelphiWorld 6.0

 

 

 


 

 

Code:

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;

©Drkb::04075

http://delphiworld.narod.ru/

DelphiWorld 6.0

 

 


 

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

 

Code:

function FormatData(s: String; i: Integer): String;

begin

Result:=FloatToStr(Round(StrToFloat(s)*exp(i*ln(10)))/(exp(i*ln(10))));

end;

©Drkb::04076

http://delphiworld.narod.ru/

DelphiWorld 6.0

 

 


 

Как округлять до сотых в большую сторону

 

Code:

uses Math;

 

{©Drkb v.3(2007): www.drkb.ru,

®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com}

 

 

// Прибавляешь 0.5 затем округляешь:

 

function RoundMax(Num: real; prec: integer): real;

begin

result := roundto(num + Power(10, prec - 1) * 5, prec);

end;

 

// До сотых соответственно будет:

 

function RoundMax100(Num: real): real;

begin

result := round(num * 100 + 0.5) / 100;

end;

 

©Drkb::04077

Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)

 

 

 


Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> «Округление» в большую сторону

 

Функция возвращает наименьшее число, большее чем Value, которое без остатка

делится на Divider

 

Зависимости: нет

Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург

Copyright:   Dimka Maslov

Дата:        20 мая 2002 г.

***************************************************** }

 

function RoundNext(Value, Divider: Integer): Integer;

asm

  mov ecx, edx

  cdq

  idiv ecx

  imul ecx

  add eax, ecx

end;

 

//Пример использования:

 

RoundNext(10, 3) // = 12

RoundNext(9, 3) // = 12

©Drkb::04078


 

Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> «Округление» в меньшую сторону

 

Функция возвращает наибольшее число,

меньшее или равное Value, которое

без остатка делится на Divider

 

Зависимости: нет

Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург

Copyright:   Dimka Maslov

Дата:        20 мая 2002 г.

***************************************************** }

 

function RoundPrev(Value, Divider: Integer): Integer;

asm

  mov ecx, edx

  cdq

  idiv ecx

  imul ecx

end;

 

//Пример использования:

 

RoundPrev(10, 3) // = 9

RoundPrev(9, 3) // = 9

©Drkb::04079


 

Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> «Округление» до ближайшего кратного

 

Функция возвращает ближайшее к Value число, которoе без

остатка делится на N. Если Value находится посередине

между двумя кратными, функция вернёт большее значение.

 

Зависимости: нет

Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург

Copyright:   Dimka Maslov

Дата:        20 февраля 2003 г.

***************************************************** }

 

function RoundTo(Value, N: Integer): Integer;

asm

  push ebx

  mov ebx, eax

  mov ecx, edx

  cdq

  idiv ecx

  imul ecx

 

  add ecx, eax

  mov edx, ebx

  sub ebx, eax

  jg @@10

  neg ebx

@@10:

  sub edx, ecx

  jg @@20

  neg edx

@@20:

  cmp ebx, edx

  jl @@30

  mov eax, ecx

@@30:

  pop ebx

end;

 

©Drkb::04080


 

Округление дробного числа до N знаков после запятой

 

Автор: Perceptron

Code:

function RoundEx(chislo: double; Precision: Integer): string;

var

ChisloInStr: string;

ChisloInCurr: currency;

begin

ChisloInCurr := chislo;

Str(ChisloInCurr: 20: Precision, ChisloInStr);

ChisloInStr[Pos('.', ChisloInStr)] := ',';

RoundEx := Trim(ChisloInStr);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit1.Text := RoundEx(StrToFloat(Edit1.Text), 2);

end;

©Drkb::04081

http://delphiworld.narod.ru/

DelphiWorld 6.0


 

 

Округление чисел c определенной точностью

 

 

Code:

function Rounder(var Value: Double; Decimals: Integer): Double;

var

  j: Integer;

  A: Double;

begin

  A := 1;

  case Decimals of

    0: A := 1;

    1: A := 10;

    else

      for j := 1 to Decimals do

        A := A * 10;

  end;

  Result := Int((Value * A) + 0.5) / A;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

var

  Value: Double;

begin

  Value := 23.56784;

  //Result is 23.57

label1.Caption := FloatToStr(Rounder(Value, 2));

end;

©Drkb::04082

Взято с сайта: http://www.swissdelphicenter.ch


 

Code:

{

The function Round of the Delphi doesn't work

like it is usually expected.

The odd numbera are rounded down and the even numbers up.

 

 

Example/ Beispiel:

 

x:= Round(17.5) = x = 18

 

x:= Round(12.5) = x = 12

}

 

function DoRound(const X: Extended): Int64;

begin

  Result := 0;

  if X0 then

    Result := trunc(X + 0.5);

  if Xthen

    Result := trunc(X - 0.5);

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ShowMessage(FormatFloat('0.00', DoRound(17.5)));  // - 18

ShowMessage(FormatFloat('0.00', DoRound(12.5)));  // - 13

 

//This rounds every value to 0.05 steps

//Rundet in 0.05 Schritten

ShowMessage(FormatFloat('0.00', Round(17.22 / 0.05) * 0.05)); // - 17.20

end;

 

 

{***Another function:***}

 

function RoundUp(Value: Extended): Int64;

  procedure Set8087CW(NewCW: Word);

  asm

         MOV     Default8087CW,AX

         FNCLEX

         FLDCW   Default8087CW

end;

const

  RoundUpCW = $1B32;

var

  OldCW: Word;

begin

  OldCW := Default8087CW;

  try

    Set8087CW(RoundUpCW);

    Result := Round(Value);

  finally

    Set8087CW(OldCW);

  end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  ShowMessage(FormatFloat('0.00', RoundUp(19.32)));  // - 19

end;

©Drkb::04083

Взято с сайта: http://www.swissdelphicenter.ch