...round a number correctly?

Author: Simon Grossenbacher
Homepage: http://www.swissdelphicenter.ch

Category: Math

{
  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.

  Die Round Funktion in Delphi gibt normalerweise nicht
  die erwartete Zahl zurück.
  Die ungeraden Zahlen werden abgerundet, die geraden aufgerundet

  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;

 

printed from
www.swissdelphicenter.ch
developers knowledge base