Значение float изменяется при присваивании в Java - PullRequest
0 голосов
/ 02 ноября 2019

Когда я присваиваю 2.3211232f как значение переменной float в Java , она присваивается как 2.3211231 этой переменной. Почему это происходит?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

В Java значения с плавающей точкой выражаются в единицах степени двух. Для чисел от 2 до 4 единица, используемая для float, равна 2 -22 . Это потому, что float имеет 24-битные значения, поэтому, когда старший бит представляет 2 1 , как это должно быть для чисел между 2 и 4, младший бит представляет 2 1-23 = 2 -22 .

2 -22 равно 0,0000002384185791015625, поэтому представляемые числа между 2 и 4 разнесены с шагом в такой размер. Представляемый номер рядом 2.3211232 является:

1016 +2,3211228847503662109375 1019 * 2,3211231231689453125000 1021 * +2,3211233615875244140625 1023

Из тех, +2,3211231231689453125000 расположено ближе всего к 2.3211232,Таким образом, когда исходный текст 2.3211232f преобразуется в float, результат равен 2.3211231231689453125000.

Форматирование по умолчанию в Java отображает его как «2.3211231», поскольку оно использует только достаточно десятичных цифр для однозначной идентификации значения. Он не показывает все цифры точного значения, поэтому он искажает значение. Никогда не воспринимайте результат форматирования по умолчанию как фактическое значение.

0 голосов
/ 02 ноября 2019

Java float - это 32-битное значение с плавающей точкой. Википедия говорит:

Это дает точность от 6 до 9 значащих десятичных цифр.

Ваше число имеет 8 цифр, и, похоже, оно превышаетчто может обработать float.

Если вы хотите увидеть точность при заданном значении, вызовите метод Math.ulp(float f).

Если вы хотитепосмотрите, что может обработать следующее значение вниз / вверх float, используйте методы Math.nextDown(float f) и Math.nextUp(float f).

float f = 2.3211232f;
System.out.println("f    = " + f);
System.out.println("down = " + Math.nextDown(f));
System.out.println("up   = " + Math.nextUp(f));
System.out.println("ulp  = " + Math.ulp(f));

Вывод

f    = 2.3211231
down = 2.321123
up   = 2.3211234
ulp  = 2.3841858E-7

Как видите, ваше значение 2.3211232 не может быть сохранено в float, поскольку следующее значение по сравнению с 2.3211231 равно 2.3211234.

Как показывает ULP (единица измерения в последнем месте), точность последней (7-й) цифры составляет 2,4, поэтому в 7-й цифре между соседними значениями имеется от 2 до 3 шагов.

...