Solved

# Need help with a rounding problem

Posted on 2004-10-19
228 Views
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
Question by:rutledgj
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 17

Accepted Solution

geobul earned 100 total points
ID: 12348607
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

LVL 12

Expert Comment

ID: 12348668
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

LVL 14

Expert Comment

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

LVL 12

Expert Comment

ID: 12350702
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

LVL 12

Expert Comment

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

LVL 17

Expert Comment

ID: 12356985
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

LVL 12

Expert Comment

ID: 12362112
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

LVL 12

Assisted Solution

esoftbg earned 50 total points
ID: 12362192
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

LVL 12

Expert Comment

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

LVL 17

Expert Comment

ID: 12367204
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 Comment

ID: 12368367
You are right. Negative numbers were not a concern.

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the inâ€¦
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have toâ€¦
There are cases when e.g. an IT administrator wants to have full access and view into selected mailboxes on Exchange server, directly from his own email account in Outlook or Outlook Web Access. This proves useful when for example administrator wantâ€¦
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
###### Suggested Courses
Course of the Month9 days, 12 hours left to enroll