简体   繁体   中英

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.

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.

虽然表示的结果5 + 3 * (4 - 1) / 2在浮法中,实际的评价与的整数的精度完成,这意味着划分9 / 2返回4,而不是4.5你将得到如果他们被评估为浮动。

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.

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 (eg 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM