Java ранжирует примитивные типы в порядке int < long < float < double
.Если оператор используется с различными типами примитивов, тип, который появляется перед другим в приведенном выше списке, будет неявно преобразован в другой без какой-либо диагностики компилятора, даже в тех случаях, когда это может привести к потере точности.Например, 16777217-1.0f
даст 16777215.0f (на единицу меньше правильного значения).Во многих случаях операции между float
и int
вне диапазона +/- 16777216 должны выполняться путем приведения значений int
к double
, выполнения операции, а затем - при необходимости - приведениярезультат до float
.Я нахожу требование для двойного приведения раздражающим, но правила приведения типов в Java требуют, чтобы кто-либо использовал раздражающее двойное приведение или потерял точность.