Solved

# Rounding numbers

Posted on 2004-08-12

Hi.

There is a form with 2 buttons.

Button1 OnClick event looks like this:

procedure TForm1.Button1Click(Sender: TObject);

function RoundedAmount(R: double; D: Longint): Double;

function SymbolOf(Nbr: Double): Double;

begin

if Nbr < 0 then

Result := -1

else

Result := 1;

end;

function NbrExponentOf(Nbr: Double; Exponent: Integer): Double;

begin

Result := 1;

while Exponent < 0 do

begin

Result := Result / Nbr;

Exponent := Exponent + 1;

end;

while Exponent > 0 do

begin

Result := Result * Nbr;

Exponent := Exponent - 1;

end;

end;

var

P: double;

X: double;

dNbrExp: double;

begin

P := SymbolOf(R) * 0.5;

dNbrExp := NbrExponentOf(10, D);

X := R * dNbrExp + P;

Result := int(X) / dNbrExp;

end;

begin

showmessage(FloatToStr(RoundedAmount(0.105, 2)));

end;

And here is Button2.OnClick event:

procedure TForm1.Button2Click(Sender: TObject);

function RoundedAmount(R: double; D: Longint): Double;

function SymbolOf(Nbr: Double): Double;

begin

if Nbr < 0 then

Result := -1

else

Result := 1;

end;

function NbrExponentOf(Nbr: Double; Exponent: Integer): Double;

begin

Result := 1;

while Exponent < 0 do

begin

Result := Result / Nbr;

Exponent := Exponent + 1;

end;

while Exponent > 0 do

begin

Result := Result * Nbr;

Exponent := Exponent - 1;

end;

end;

var

P: double;

begin

P := SymbolOf(R) * 0.5;

Result := Int(R * NbrExponentOf(10, D) + P) / NbrExponentOf(10, D);

end;

begin

showmessage(FloatToStr(RoundedAmount(0.105, 2)));

end;

The only difference is the inline "RoundedAmount" which is slightly different between Button1 and Button2. "RoundedAmount" is supposed to round an amount of money (No I CANNOT use any Delphi's Math functions like RoundTo. The point isn't there anyways). Here are the only differences between the 2 functions:

With Button2, I calculate RESULT on a single line:

P := SymbolOf(R) * 0.5;

Result := Int(R * NbrExponentOf(10, D) + P) / NbrExponentOf(10, D);

With Button1, I calculate RESULT using multiple variables so it can stand on multiple lines:

P := SymbolOf(R) * 0.5;

dNbrExp := NbrExponentOf(10, D);

X := R * dNbrExp + P;

Result := int(X) / dNbrExp;

At first look, both functions should give the same result, right ?. And that is my problem: IT DOES NOT!!

When I hit Button1 I get 0.11 and with Button2 I get 0.1.

My question is simple: why is that ? How can I fix this ?