programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
• Tim Cooke
• Campbell Ritchie
• Ron McLeod
• Liutauras Vilda
• Jeanne Boyarsky
Sheriffs:
• Junilu Lacar
• Rob Spoor
• Paul Clapham
Saloon Keepers:
• Tim Holloway
• Tim Moores
• Jesse Silverman
• Stephan van Hulst
• Carey Brown
Bartenders:
• Al Hobbs
• Piet Souris
• Frits Walraven

# doubt regarding basic primitives

Ranch Hand
Posts: 114
• Number of slices to send:
Optional 'thank-you' note:
System.out.println(5.0 == 5L);

the output is true.

i do not understand why is it so.
5.0 would be treated as a double, where as 5L is treated as a long
so how can comparison of a double and a long be true ??

Pl explain.

Also System.out.println(5.1 == 5.1F);
gives the output as false.

Ranch Hand
Posts: 2412
• Number of slices to send:
Optional 'thank-you' note:
In the case of a double and a long, the long will be promoted to a double.

If both operands are byte, char, short, or int, then both operands are promoted to int before the operation.

If one operand is a long and the other a lesser type, both operands are promoted to long.

If one operand is a float and the other a lesser type, both operands are promoted to float.

If one operand is a double and the other a lesser type, both operands are promoted to double.

Ranch Hand
Posts: 114
• Number of slices to send:
Optional 'thank-you' note:
hi keith,

But tell me why is there a difference between the two answers ??

if 5.0 == 5L results in true, then
why does 5.1 == 5.1F result in false ?

Keith Lynn
Ranch Hand
Posts: 2412
• Number of slices to send:
Optional 'thank-you' note:
Some floating point numbers cannot be stored exactly in a computer.

Consider this example.

The output on my machine is

So a better way to compare two floating point numbers would be to look at the absolute value of their difference.
[ March 12, 2007: Message edited by: Keith Lynn ]

Ranch Hand
Posts: 178
• Number of slices to send:
Optional 'thank-you' note:

I tried the above and have given the corresponding result on my machine.

In 1. In the case of Double and Float, (from the results above) there is no promotion taking place.

In 2., 5.1 with no F or D at the end, defaults to Double and therefore false like case 1.

In 3., it is true because 5.1 is actually 5.1D.

Keith Lynn
Ranch Hand
Posts: 2412
• Number of slices to send:
Optional 'thank-you' note:
I'm not sure what you mean by no promotion taking place because you have a double and a float.

This is from the Java Language Specification 5.6.2.

When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order, using widening conversion (�5.1.2) to convert operands as necessary:

* If any of the operands is of a reference type, unboxing conversion (�5.1.8) is performed. Then:
* If either operand is of type double, the other is converted to double.
* Otherwise, if either operand is of type float, the other is converted to float.
* Otherwise, if either operand is of type long, the other is converted to long.
* Otherwise, both operands are converted to type int.

Binary numeric promotion is performed on the operands of certain operators:

* The multiplicative operators *, / and % (�15.17)
* The addition and subtraction operators for numeric types + and - (�15.18.2)
* The numerical comparison operators <, <=, >, and >= (�15.20.1)
* The numerical equality operators == and != (�15.21.1)
* The integer bitwise operators &, ^, and | (�15.22.1)
* In certain cases, the conditional operator ? : (�15.25)

The reason 5.1 prints out exactly in the last two statements is that there is no conversion taking place.

But consider this example.

The output is