Это из-за того, как битовая структура организована, когда вы делите пять и три, это неточное значение с плавающей запятой (это 1.6666666
и крошечный бит).Просто как тот.Чтобы продемонстрировать,
float f = (float) (5.0 / 3);
System.out.printf("%f=%s %s=%s%n", f, Float.toHexString(f),
(double) f, Double.toHexString(f));
System.out.printf("%s=%s %s=%s%n", f, Float.toHexString(f),
(double) f, Double.toHexString(f));
Вывод будет
1.666667=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0
1.6666666=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0
В обоих случаях вы заметите, что битовая комбинация постоянна.