• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 230
  • Last Modified:

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
Asked:
rutledgj
2 Solutions
 
geobulCommented:
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
 
esoftbgCommented:
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
 
DragonSlayerCommented:
Also check out the floor and ceil functions in the maths unit
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
esoftbgCommented:
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(FloatToStr(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(FloatToStr(Floor(DA[I])))
      else
        ListBox2.Items.Add(FloatToStr(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(FloatToStr(Floor(DA[I])))
      else
        ListBox3.Items.Add(FloatToStr(Round(DA[I]+0.00000001)));
  end;
end;
0
 
esoftbgCommented:
Post
Button1, Button2, Button3,
ListBox1, ListBox2, ListBox3
on the Form1 to see the results from above code.
0
 
geobulCommented:
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.).
0
 
esoftbgCommented:
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.
0
 
esoftbgCommented:
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;
    ListBox2.Items.Add(IntToStr(J));
  end;
end;
0
 
esoftbgCommented:
kretzschmar,
please redirect the points of this question to geobul,
because his solutions are correct and elegant.
Emil.
0
 
geobulCommented:
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
 
rutledgjAuthor Commented:
You are right. Negative numbers were not a concern.

0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now