ONOZ
ONOZ

Reputation: 1410

C# is rounding down divisions by itself

When I make a division in C#, it automaticaly rounds down. See this example:

double i;
i = 200 / 3;
Messagebox.Show(i.ToString());

This shows me a messagebox containing "66". 200 / 3 is actually 66.66666~ however.

Is there a way I can avoid this rounding down and keep a number like 66.6666667?

Upvotes: 39

Views: 48694

Answers (10)

Tekahe
Tekahe

Reputation: 1

All given answers are wrong because they translate the integer division into one of kind double, which is cleanly not what was asked for (at least from a performance standpoint). The obvious answer is elementary school math, multiply by 10, add 5 and divide again, all integer.

i = (2000 / 3 + 5 ) / 10

You are catching a second division here, which is better than doing double conversions but still far from perfect. You could go even further and multiply by another factor and add other values than five, thus allowing you to use right shifting instead of dividing by 10. The exact formula for doing this is left as an exercise to the reader. (Just google "divisions with Multiply Shift")

Have a nice day.

Upvotes: -2

Petar Ivanov
Petar Ivanov

Reputation: 93090

You can specify format string with the desired number of decimal ponits:

double i;
i = 200 / 3.0;
Messagebox.Show(i.ToString("F6"));

Upvotes: 6

sclarson
sclarson

Reputation: 4422

Aside from the double vs int happening in that action, you're thinking of double as a precise unit. Try using the decimal datatype when you really care about accuracy.

More information at this answer: decimal vs double! - Which one should I use and when?

Upvotes: 4

JoshuaRogers
JoshuaRogers

Reputation: 405

Though the answer is actually 66.666, what is happening is that 200 / 3 is being calculated resulting in an integer. The integer is then being placed in the float. The math itself is happening as integer math. To make it a float, use 200.0 / 3. The .0 will cause it to treat 200 as a float, resulting in floating point math.

Upvotes: 4

rsbarro
rsbarro

Reputation: 27369

i = 200 / 3 is performing integer division.

Try either:

i = (double)200 / 3

or

i = 200.0 / 3

or

i = 200d / 3

Declaring one of the constants as a double will cause the double division operator to be used.

Upvotes: 63

Chad
Chad

Reputation: 364

double i = 200.0 / 3;

double i = ((double)200)/3;

What happens is the two integers perform an integer divide, and then the integer answer is assigned to the float. To avoid that, always cast one of the numbers as a double.

Upvotes: 2

Bala R
Bala R

Reputation: 109027

Try this

i = 200d/3d;

and it will not round.

Upvotes: 1

Mike M.
Mike M.

Reputation: 12551

200 and 3 are both integers, so the result will be an integer. Convert one of them to a decimal.

Upvotes: 0

Yakov Galka
Yakov Galka

Reputation: 72539

200 / 3 this is an integer division. Change to: 200.0 / 3 to make it a floating point division.

Upvotes: 6

John Boker
John Boker

Reputation: 83729

200/3 is integer division, resulting in an integer.

try 200.0/3.0

Upvotes: 8

Related Questions