Java продвигает его правильно, иначе был бы довольно большой объем кода, который был бы проблематичным: -)
Раздел 5.1.2 спецификации языка Java Подробнее:
Следующие 19 конкретных преобразований примитивных типов называются расширяющимися примитивными преобразованиями:
byte to short, int, long, float, or double
short to int, long, float, or double
char to int, long, float, or double
int to long, float, or double
long to float or double
float to double
Расширяющиеся примитивные преобразования не теряют информацию об общей величине числового значения. Действительно, преобразования, расширяющиеся из целочисленного типа в другой целочисленный тип и из числа с плавающей точкой в double, вообще не теряют никакой информации; числовое значение сохраняется точно. Преобразования, расширяющиеся из числа с плавающей точкой в удвоение в выражениях строгого выражения, также точно сохраняют числовое значение; однако такие преобразования, которые не являются строгими, могут привести к потере информации об общей величине преобразованного значения.
Преобразование значения типа int или long в значение float, или значения long в удвоенное значение может привести к потере точности, то есть результат может потерять некоторые из младших значащих битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима округления до ближайшего стандарта IEEE 754.
Преобразование из 32-битной Java int
в double
(которая в Java имеет точность более 50 бит) не приведет к потере величины или любой точности. Если используемая вами константа принудительно устанавливается в long
из-за ее значения, вы можете потерять точность, поскольку long
имеет 64-битную точность.