Vishal Arora

Greenhorn

Posts: 9

posted 12 years ago

I got this question given below from a mock exam and i m not able to understand its output.Can somebody explain why its output will be "false true false true".

import java.io.*;

public class T026

{

public static void main(String args[])

{

System.out.print((1 - 1 / 3 * 3 ==0)+" "); //1

System.out.print((1 - 1.0f / 3.0f * 3.0f==0)+" "); //2

System.out.print((1 - 1.0f / 3.0f * 3.0d==0)+" "); //3

System.out.print((1 - 1.0d / 3.0d * 3.0d==0)+" "); //4

}

}

import java.io.*;

public class T026

{

public static void main(String args[])

{

System.out.print((1 - 1 / 3 * 3 ==0)+" "); //1

System.out.print((1 - 1.0f / 3.0f * 3.0f==0)+" "); //2

System.out.print((1 - 1.0f / 3.0f * 3.0d==0)+" "); //3

System.out.print((1 - 1.0d / 3.0d * 3.0d==0)+" "); //4

}

}

Sherry Jacob

Ranch Hand

Posts: 128

posted 12 years ago

Hi,

Here are the answers to ur queries:

The first statement,

1 - (1/3) * 3 = 1 - (0 * 3) = 1 - 0 = 1.

This is because in integer arithmetic operations, the division operator (/) has highest precedence followed by the multiplication operator (*) followed by Addition and Subtraction. Hence //1 returns false.

Again, the evaluation proceeds as 1 - (1.0f / 3.0f) * 3.0f = 1 - (0.3333333... * 3) = 1 - 1 = 0. Thus //2 returns true.

The evaluation proceeds as 1 - (1.0f / 3.0f) * 3.0d. But here we have a floating point and a double value. So the floating point operation is performed first...then converted to double...1 - 0.33333d * 3.0d. But converting from floating point to double causes some loss of precision and hence the result is <> 0. Hence //3 returns false.

Finally,

returns true as all operations are with double values. Reasoning is much the same as at //2

Hope u got ur answers ?

Correct me if I was wrong anywhere.

Here are the answers to ur queries:

The first statement,

will be evaluated as follows:1 - 1 / 3 * 3

1 - (1/3) * 3 = 1 - (0 * 3) = 1 - 0 = 1.

This is because in integer arithmetic operations, the division operator (/) has highest precedence followed by the multiplication operator (*) followed by Addition and Subtraction. Hence //1 returns false.

1 - 1.0f / 3.0f * 3.0f

Again, the evaluation proceeds as 1 - (1.0f / 3.0f) * 3.0f = 1 - (0.3333333... * 3) = 1 - 1 = 0. Thus //2 returns true.

1 - 1.0f / 3.0f * 3.0d

The evaluation proceeds as 1 - (1.0f / 3.0f) * 3.0d. But here we have a floating point and a double value. So the floating point operation is performed first...then converted to double...1 - 0.33333d * 3.0d. But converting from floating point to double causes some loss of precision and hence the result is <> 0. Hence //3 returns false.

Finally,

1 - 1.0d / 3.0d * 3.0d

returns true as all operations are with double values. Reasoning is much the same as at //2

Hope u got ur answers ?

Correct me if I was wrong anywhere.

<strong><br />Cheers !!<br /> <br />Sherry<br /></strong><br />[SCJP 1.4]