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

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:

I wrote it in the following way

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:
I get compiler warnings.
What is the correct way to write it?

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.

HainKurtSr. System AnalystCommented:
try this

star90Author Commented:
Thanks for the answer.
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)?
star90Author Commented:
Another example:
I get the warning:
Converting from double to ´unsigned_long´,possible loss of data.

The solution I used:
Is it the correct way to solve it?
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

HainKurtSr. 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

double elapsed_time;

Return Value
The difference in seconds (time2-time1) as a floating point double.
>> 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.
star90Author 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?
>> 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.
star90Author Commented:
Hi Infinity08,
Thanks for your answer.
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?

star90Author Commented:
Thanks I see about the casting.
>> 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;

Experts Exchange Solution brought to you by

Your issues matter to us.

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

Start your 7-day free trial
Just checking your question - You wrote:


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.
star90Author Commented:
Hi Infinity08,
1)Thanks for the detailed answer, it fully answered my questions.
I made a mistake in my question, I meant int and I typed integer.

2) Hi phoffric,
I also made a mistake with this I meant to write
I understand now that the problem of getting 0 instead of 10043  happens because my program crashes and not because of the casting issues.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual C++.NET

From novice to tech pro — start learning today.