glcohen
glcohen

Reputation: 193

How do math equations work in Java?

When I do something like this

int test = 5 + 3 * (4 - 1) / 2;

I get 9. I suspected this was because int rounds down. However, when I do this

float test = 5 + 3 * (4 - 1) / 2;

I also get 9. However, when I do this

float test1 = 5;
float test2 = 4.5;
float test = test1 + test2;

Test finally outputs 9.5. Could someone explain the logic behind this? Why don't I get 9.5 in the second example? Thanks.

Upvotes: 6

Views: 37628

Answers (4)

user1639464
user1639464

Reputation:

The short answer is that integer types operate on modular arithmetic, with modulus 1, and discard the remainder.

Since you cast test as an integer, modular arithmetic is employed with modulus 1 (e.g. 9.5 mod 1), int test = 5 + 3 * (4 - 1) / 2;

With a 32-or-64 bit float this would give 9.5; however, because you have cast test as an int, the remainder is discarded, and the value referenced by test is 9.

Upvotes: 0

Jon Hanna
Jon Hanna

Reputation: 113222

Expressions have their own type. So start with:

5 + 3 * (4 - 1) / 2

Each value has its own type. This type happens to be int, so this is the same as:

((int)5) + ((int)3) * (((int)4) - ((int)1)) / ((int)2)

Making it clearer that we're dealing with ints. Only after this is evaluated as 9 does it get assigned to a float.

Upvotes: 2

Greg Hewgill
Greg Hewgill

Reputation: 992707

In your second example, although you are assigning the result to a variable of type float, the calculation itself is still performed exactly the same way as the first example. Java does not look at the destination variable type to determine how to calculate the right hand side. In particular, the subexpression 3 * (4 - 1) / 2 results in 4.

To fix this, you can use floating point literals instead of all integers:

float test = 5 + 3 * (4 - 1) / 2.0f;

Using 2.0f triggers floating point calculations for the arithmetic expression.

Upvotes: 17

FThompson
FThompson

Reputation: 28687

Although you represent the result of 5 + 3 * (4 - 1) / 2 in a float, the actual evaluation is done with the precision of an integer, meaning that the division of 9 / 2 returns 4 rather than the 4.5 you would receive if they were evaluated as floats.

Upvotes: 3

Related Questions