Casting floating numbers

I am having trouble casting the following numbers. I am just trying print intergers. So, 1, 3, 42, 80, 4. If I cast those numbers to int, I have 1, 2, 41, 79, 4. Or is there any trick?

1.00021
3.00
42.00
80.00
4.00

Anybody has any idea?
Who is Participating?

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
@dkim18:

> Anybody has any idea?

Casting as an Int truncates, but you want to round, so add .5 to it before the cast.
So try this:
int nVal = (int)(nFloat + 0.5f);

Hope That Helps,
Dex*
0
Commented:
>>If I cast those numbers to int, I have 1, 2, 41, 79, 4.

It seems that the display is not what the values actually are. Casting should always work, e.g.

float f = 80.00;
int n = (int) f;

However, you might have to take the machine accuracy (eps) into consideration, e.g.

#include <iostream>
#include <limits>

using namespace std;

float f = 80.00;
int n = (int) f + numeric_limits<float>::epsilon();
0
Commented:
>>Casting as an Int truncates, but you want to round, so add .5 to it before the cast.

Hm, wouldn't that make the following incorrect?

float f = 80.70;
int n = (int) f + 0.5f;
0
Commented:
@jkr:  Yes, what you listed is incorrect, but that's not what I said to do.  I said to do it like this:
int n = (int) (f + 0.5f);

Which works just fine.
0
Commented:
OK, then, what would be the result of

int n = (int) (88.70 + 0.5f);

?
0
Commented:
After that line, n will have the value of 89.

88.70 + 0.5 = 89.20, which, when truncated, gives you 89.

Am I missing something?

Dex*
0
Commented:
>>Am I missing something?

As the Q was about casting, not rounding...
0
Commented:
Yeah, that's true, and the question wasn't totally clear, but what I understood was that they expected 1, 3, 42, 80, 4 but were getting 1, 2, 41, 79, 4 instead...  Which looks like a rounding problem to me.  Maybe I'm way off.

Dex*
0
Author Commented:
As I said, it is not rounding problem. I just want to print out integer only, but castinig is not working.
-----------------------
float keno_float_1 = 0.00;
float keno_float_2 = 0.00;
float keno_float_3 = 0.00;
int keno_int = 0;
while(order < 6)
{
keno_float_1 = keno_array[from_top];
keno_float_2 = float(int(keno_array[from_top]))*1.00;

cout<<keno_float_1 <<", "<<keno_float_2<<endl;
keno_float_3 = keno_float_1 - keno_float_2;
cout<<"keno_float_3 "<<(int)(keno_float_3*100.00)<<endl;
...
...
---------------------

99.01, 99
keno_float_3: 1
87.61
69.03, 69.00
keno_float_3: 2
61.06
58.42, 58.00
keno_float_3: 41
51.33
45.80, 45.00
keno_float_3: 79
39.82
37.04, 37.00
keno_float_3: 4
32.74
-----------
From above, casting is not working...,but the first one fifth one are working.
0
Commented:
Geez, I had to stare at that for a while to figure out what you were trying to do.

Try this:
cout<<"keno_float_3 "<<(int)((keno_float_3+0.5f)*100.00)<<endl;

Or maybe it is:
cout<<"keno_float_3 "<<(int)((keno_float_3*100.00)+0.5f)<<endl;

I can't tell without trying it out.  If neither of those work, would you please post the values from keno_array that you are using?

Dex*
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
0
Author Commented:
I have tried like this 'numeric_limits<float>::epsilon()',

keno_float_1 = keno_array[from_top];
keno_float_2 = float(int(keno_array[from_top]))*1.00;
keno_num = keno_float_1 - keno_float_2;

cout<<endl;
//prints number
int n = (int) keno_num + numeric_limits<float>::epsilon();

but I was having the following problem.
-----
AnalyzeOutput.cpp: In function `void Write_Analyzed_File(char *, char *)':
AnalyzeOutput.cpp:193: `numeric_limits' undeclared (first use this function)
AnalyzeOutput.cpp:193: (Each undeclared identifier is reported only once
AnalyzeOutput.cpp:193: for each function it appears in.)
AnalyzeOutput.cpp:193: parse error before `>'
------

Dexstar,
your solution worked this part, but didn't work for the other part.(two of numbers were incorrect.)
Sorry for my messy code. I was experimenting to solve this problem.
0
Author Commented:
I wasn't sure how to use 'numeric_limits<float>::epsilon()' method.
Indeed,
#include <limits>
using namespace std;
didn't worked.
this gives me error, so I had to use #include <limits.h> even though I use for others like this
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <limits.h>

using namespace std;

By the way, I am using Sun Solaris system.
0
Commented:
@dkim18:  What are the values for keno_array[from_top] that you are using?
0
Author Commented: