rutledgj
asked on
Need help with a rounding problem
I need some code (formula) that can return an integer value based on these rules:
1. No rounding
value returned value
0.9 0
1.1 1
1.5 1
.5 0
2. < 1 rounding
value returned value
.9 0
1.1 1
1.5 2
.5 0
3. < 0.5 rounding
value returned value
.3 0
.5 1
1.5 2
1.2 1
Obviously the value can be any decimal number so I need a formula or three that can handle this kind of rounding.
1. No rounding
value returned value
0.9 0
1.1 1
1.5 1
.5 0
2. < 1 rounding
value returned value
.9 0
1.1 1
1.5 2
.5 0
3. < 0.5 rounding
value returned value
.3 0
.5 1
1.5 2
1.2 1
Obviously the value can be any decimal number so I need a formula or three that can handle this kind of rounding.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Also check out the floor and ceil functions in the maths unit
procedure TForm1.Button1Click(Sender : TObject);
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.9;
DA[1] := 1.1;
DA[2] := 1.5;
DA[3] := 0.5;
for I := 0 to 3 do
ListBox1.Items.Add(FloatTo Str(Floor( DA[I])));
end;
procedure TForm1.Button2Click(Sender : TObject);
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.9;
DA[1] := 1.1;
DA[2] := 1.5;
DA[3] := 0.5;
for I := 0 to 3 do
begin
if (DA[I]<1) then
ListBox2.Items.Add(FloatTo Str(Floor( DA[I])))
else
ListBox2.Items.Add(FloatTo Str(Round( DA[I])));
end;
end;
procedure TForm1.Button3Click(Sender : TObject);
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.3;
DA[1] := 0.5;
DA[2] := 1.5;
DA[3] := 1.2;
for I := 0 to 3 do
begin
if (DA[I]<0.5) then
ListBox3.Items.Add(FloatTo Str(Floor( DA[I])))
else
ListBox3.Items.Add(FloatTo Str(Round( DA[I]+0.00 000001)));
end;
end;
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.9;
DA[1] := 1.1;
DA[2] := 1.5;
DA[3] := 0.5;
for I := 0 to 3 do
ListBox1.Items.Add(FloatTo
end;
procedure TForm1.Button2Click(Sender
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.9;
DA[1] := 1.1;
DA[2] := 1.5;
DA[3] := 0.5;
for I := 0 to 3 do
begin
if (DA[I]<1) then
ListBox2.Items.Add(FloatTo
else
ListBox2.Items.Add(FloatTo
end;
end;
procedure TForm1.Button3Click(Sender
var
I: Integer;
DA: array[0..3] of Double;
begin
DA[0] := 0.3;
DA[1] := 0.5;
DA[2] := 1.5;
DA[3] := 1.2;
for I := 0 to 3 do
begin
if (DA[I]<0.5) then
ListBox3.Items.Add(FloatTo
else
ListBox3.Items.Add(FloatTo
end;
end;
Post
Button1, Button2, Button3,
ListBox1, ListBox2, ListBox3
on the Form1 to see the results from above code.
Button1, Button2, Button3,
ListBox1, ListBox2, ListBox3
on the Form1 to see the results from above code.
I'm surprised :-(
BTW in the accepted answer:
- The first one will behave unexpectedly with negative numbers, i.e. '-1.5' will become '-2' instead of '-1'.
- I can't say anythung about 2 because I haven't understood the requirement.
- IMHO the last one is wrong. That constant depends on the type of the real variable and its specific representation (OS, processor, etc.).
BTW in the accepted answer:
- The first one will behave unexpectedly with negative numbers, i.e. '-1.5' will become '-2' instead of '-1'.
- I can't say anythung about 2 because I haven't understood the requirement.
- IMHO the last one is wrong. That constant depends on the type of the real variable and its specific representation (OS, processor, etc.).
Hi Geo, you are right !
I did not think abot the negative values at all ....
Your solutions about [1.] and [3.] are elegant !
So, how we could solve I am graded in mistake ?
I think the page editor could redirect points to you.
I did not think abot the negative values at all ....
Your solutions about [1.] and [3.] are elegant !
So, how we could solve I am graded in mistake ?
I think the page editor could redirect points to you.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
kretzschmar,
please redirect the points of this question to geobul,
because his solutions are correct and elegant.
Emil.
please redirect the points of this question to geobul,
because his solutions are correct and elegant.
Emil.
Hi Emo,
The questioner is the one who decides which answer fits his needs. It is most likely that he doesn't care about negative numbers at all. So, there is no problem with the grading. I just wanted to leave my thougths for eventual future readers of this question. Hope it's clear now.
BTW. Congratulations, Emo, for your outstanding work here at Ex-Ex. I don't feel alone anymore ;-)
The questioner is the one who decides which answer fits his needs. It is most likely that he doesn't care about negative numbers at all. So, there is no problem with the grading. I just wanted to leave my thougths for eventual future readers of this question. Hope it's clear now.
BTW. Congratulations, Emo, for your outstanding work here at Ex-Ex. I don't feel alone anymore ;-)
ASKER
You are right. Negative numbers were not a concern.
var
I: Integer;
D: Double;
begin
D := 0.9;
I := Round(Int(D));
Edit1.Text := IntToStr(I);
end;
2.
var
I: Integer;
D: Double;
begin
D := 0.9;
I := Round(D);
Edit1.Text := IntToStr(I);
end;