• Status: Solved
• Priority: Medium
• Security: Public
• Views: 233

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.

0
rutledgj
2 Solutions

Commented:
Hi,

1. Use Trunc function

2. What is the logic here?

3. Use:

function RoundUp(X: Extended): Int64;
begin
Result := Trunc(X) + Trunc(Frac(X) * 2);
end;

Regards, Geo
0

Commented:
1.
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;
0

Commented:
Also check out the floor and ceil functions in the maths unit
0

Commented:
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
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
else
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
else
end;
end;
0

Commented:
Post
Button1, Button2, Button3,
ListBox1, ListBox2, ListBox3
on the Form1 to see the results from above code.
0

Commented:
I'm surprised :-(

- 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.).
0

Commented:
Hi Geo, you are right !
I did not think abot the negative values at all ....

So, how we could solve I am graded in mistake ?
I think the page editor could redirect points to you.
0

Commented:
I provide here a correct version of the [2.] which works fine with both positive and negative values:

procedure TForm1.Button2Click(Sender: TObject);
type
TSignIs = (siMinus, siPlus);
var
I:      Integer;
J:      Integer;
DA:     array[0..7] of Double;
SignIs: TSignIs;
begin
DA[0] := -0.5;
DA[1] := -1.5;
DA[2] := -1.1;
DA[3] := -0.9;
DA[4] := 0.9;
DA[5] := 1.1;
DA[6] := 1.5;
DA[7] := 0.5;
for I := 0 to 7 do
begin
if (DA[I]>=0) then
SignIs := siPlus
else
begin
SignIs := siMinus;
DA[I] := ABS(DA[I]);
end;
if (DA[I]<1) then
J := Floor(DA[I])
else
J := Round(DA[I]);
if (SignIs=siMinus) then
J := - J;
end;
end;
0

Commented:
kretzschmar,
please redirect the points of this question to geobul,
because his solutions are correct and elegant.
Emil.
0

Commented:
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 ;-)
0

Author Commented:
You are right. Negative numbers were not a concern.

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.