Технически то, что здесь происходит, - это не потеря точности , а использование целочисленного деления .
Давайте рассмотрим случай f
: float f = i*9/5;
Поскольку операторы умножения и деления имеют одинаковый приоритет и левоассоциативны, оператор эквивалентен: float f = (i*9)/5;
Поскольку оба i=41
и 9
* int
-тип, тип результирующего значения также int
(369
).Таким образом, следующим шагом в оценке является 369/5
.Поскольку тип обоих операндов - int
, интерпретация оператора /
заключается в использовании целочисленного деления, которое отбрасывает любой дробный остаток.Поскольку 369/5 = 73 + 4/5
, выражение оценивается как 73
, которое затем преобразуется в float
значение 73.0
и присваивается f
.
Очень похожий процесс происходит для d
, за исключением того, что окончательное преобразование 73
в double
значение 73.0
.
Обратите внимание, что хотя я включил промежуточные шагив оценке левая ассоциативность не влияет на использование целочисленного деления.float f = i*(9/5);
приводит к f = 41.0
.