# VC++ How to convert between double calculation results and long

Hi,
I have 4 variables:

integer integer_var
integer integer_var2
double double_var
long long_var

I need to calculate the long_var variable in the following way:
long_var=(integer_var)*(integer_var2)/100)

I wrote it in the following way
long_var=long(double(integer_var)*double(integer_var2)/100)

Is it OK to write it this way?
My program crashes (possibly for other reason) but I noticed that the long_var variable equals to zero althogh (double(integer_var)*double(integer_var)/100)=10043.45

If I write the calculation without the double and the long:
long_var=((integer_var)*(integer_var)/100)
I get compiler warnings.
What is the correct way to write it?
Thanks

Thanks
###### Who is Participating?
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.

Sr. System AnalystCommented:
try this

ong_var=((integer_var)*(integer_var)/100.0)
0
Author Commented:
I checked again and I don't get warnings for it in this case.
There are however cases that I get warning like: "Converting from type double to type integer"
Please explain when do you use the : double(expression)?  or the int(expression) or long (expression)?
0
Author Commented:
Another example:
elapsed_time=(difftime(ltime2,time_t(0));
I get the warning:
Converting from double to ´unsigned_long´,possible loss of data.

The solution I used:
elapsed_time=unsigned_long(difftime(ltime2,time_t(0));
Is it the correct way to solve it?
0
Sr. System AnalystCommented:
if you try to convert a more soecific data into a less specific data, you will loose something no matter what you do ;)
and it is just a warning not error... for example if you try to convert 3.234 to a integer, it will be 3, so you will loose decimal points... to prevent errors and warnings use same type of data

elapsed_time=unsigned_long(difftime(ltime2,time_t(0));
-->
double elapsed_time;
elapsed_time=difftime(ltime2,time_t(0);

Return Value
The difference in seconds (time2-time1) as a floating point double.

http://www.cplusplus.com/reference/clibrary/ctime/difftime/
0
Commented:
>> integer integer_var

What is an integer ? Did you mean an int ?

If so, this :

>> long_var=long(double(integer_var)*double(integer_var2)/100)

should perform the calculation just fine. Assuming that integer_var and integer_var2 actually have the value that you think they have. Verify that.
0
Author Commented:
I want to understand about the double() or long() or int()  functions.
I couldn't find information about them.
Where would you look for it? in the MSDN library?
0
Commented:
>> I want to understand about the double() or long() or int()  functions.

They're cast operators ... They cast a value of one type to a value of another type :

double value = 5.3;
int value2 = (double) value;

casts the double value 5.3 to an int value 5, which is then stored in value2.

http://cplusplus.com/doc/tutorial/typecasting/
0
Author Commented:
Hi Infinity08,
My question is:
1) should I always use a function like double() or in() when I have on the left side of an equation one type and another type on the right side?

2) How can I verify that integer_var and integer_var2 actually have a value of integer?
Should I write lines of codes to check runtime error like:
if (integer_var2 is not integer) cout<<"error " ?
How can I check it?

0
Author Commented:
Thanks I see about the casting.
0
Commented:
>> 1) should I always use a function like double() or in() when I have on the left side of an equation one type and another type on the right side?

Most of the time, the compiler will implicitly add a cast to the correct type. So, this :

double value = 5.3;
int value2 = value;

(without the explicit cast) will do the same thing. Your compiler might give a warning though, because the value 5.3 is truncated to the value 5, and it wants to make sure that that was actually what you intended to do.
In cases where there exists ambiguity (like the above example), it's best to add an explicit cast to tell the compiler that this is really what you wanted to do.

In other cases, you absolutely NEED to add a cast in order to perform the correct calculations. For example, if you do :

int x = 5;
int y = 2;
double z = x / y;

both x and y are ints, so the division (/) is an integer division. The result will be 5 / 2 = 2
The compiler then adds an implicit cast to double for this integer value 2, and stores it in z. z will contain the value 2.0

If what you actually wanted, was that z contained the value 2.5, then you need to force floating point division by casting at least one of the operands to a double. For example in any of these cases, z will contain 2.5 :

double z = ((double) x) / y;                     // only the x operand is cast to a double
double z = x / ((double) y);                     // only the y operand is cast to a double
double z = ((double) x) / ((double) y);    // both the x and y operands are cast to a double

>> 2) How can I verify that integer_var and integer_var2 actually have a value of integer?

First of all, you didn't confirm whether these variables have the type int or not. integer is not a standard type in C++. What is the precise type of these two variables ?

To know what values they contain, you can just print them out to standard output :

std::cout << "integer_var : " << integer_var << std::endl;
std::cout << "integer_var2 : " << integer_var2 << std::endl;
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:
Just checking your question - You wrote:

long_var=long(double(integer_var)*double(integer_var2)/100)
..
(double(integer_var)*double(integer_var)/100)=10043.45

In the first statement, you reference integer_var and integer_var2.
But in the second statement you reference integer_var twice. Is that intentional?
You indicate that one expression gives 0, and the other gives 10043.45.

I think others have explained that you can get a zero if the actual result is, say, 0.25, and the conversion to an integer results in a truncation down to 0.
0
Author Commented:
Hi Infinity08,