Ваша интуиция верна, вы МОЖЕТЕ потерять точность при преобразовании int
в float
. Однако это не так просто, как представлено в большинстве других ответов.
В Java FLOAT использует 23-битную мантиссу, поэтому у целых чисел больше 2 ^ 23 их младшие значащие биты будут усечены. (из поста на этой странице)
Не соответствует действительности.
Пример: здесь целое число больше 2 ^ 23, которое преобразуется в число с плавающей точкой без потерь:
int i = 33_554_430 * 64; // is greater than 2^23 (and also greater than 2^24); i = 2_147_483_520
float f = i;
System.out.println("result: " + (i - (int) f)); // Prints: result: 0
System.out.println("with i:" + i + ", f:" + f);//Prints: with i:2_147_483_520, f:2.14748352E9
Следовательно, неверно, что целые числа больше 2 ^ 23 будут обрезать свои младшие значащие биты.
Лучшее объяснение, которое я нашел здесь:
Число с плавающей точкой в Java является 32-битным и представлено как:
знак * мантисса * 2 ^ экспонента
знак * (от 0 до 33_554_431) * 2 ^ (- от 125 до +127)
Источник: http://www.ibm.com/developerworks/java/library/j-math2/index.html
Почему это проблема?
Создается впечатление, что вы можете определить, есть ли потеря точности от int до float , просто взглянув на то, насколько велико int.
Я особенно видел экзаменационные вопросы по Java, где спрашивают, превратится ли большое int в float без потерь.
Кроме того, иногда люди склонны думать, что от int до float будет потеря точности:
когда int больше чем: 1_234_567_890 не верно (см. контрпример выше)
когда int больше чем: 2 экспонента 23 (равно: 8_388_608) не соответствует действительности
когда int больше чем: 2 экспонента 24 (равно: 16_777_216) не верно
Заключение
Преобразования из достаточно больших целых чисел в числа с плавающей точкой МОГУТ потерять точность.
Невозможно определить, будут ли убытки, просто , посмотрев , насколько велико значение int (т.е. не пытаясь углубиться в реальное представление с плавающей точкой).