Search code examples
javapromotions

Java Why is converting a long (64) to float (32) considered widening?


As it states from oracle

Reference from Oracle Docs

Widening Primitive Conversion 19 specific conversions on primitive types are called the widening primitive conversions:

  1. byte to short, int, long, float, or double
  2. short to int, long, float, or double
  3. char to int, long, float, or double
  4. int to long, float, or double
  5. long to float or double?
  6. float to double

If a float has 32 bits and a long has 64 how is that considered widening? Shouldn't this be considered narrowing?


Solution

  • The range of values that can be represented by a float or double is much larger than the range that can be represented by a long. Although one might lose significant digits when converting from a long to a float, it is still a "widening" operation because the range is wider.

    From the Java Language Specification, §5.1.2:

    A widening conversion of an int or a long value to float, or of a long value to double, may result in loss of precision - that is, the result may lose some of the least significant bits of the value. In this case, the resulting floating-point value will be a correctly rounded version of the integer value, using IEEE 754 round-to-nearest mode (§4.2.4).

    Note that a double can exactly represent every possible int value.