Почему мой поплавок усекается? - PullRequest
2 голосов
/ 31 января 2012

Ввод значения, такого как 27.8675309, в поле «Десятичное представление» IEEE 754 преобразователя изменяет введенное мной значение на 27.86753. Аналогично, Java отбрасывает последние две цифры при разборе строки с тем же значением.

Float.parseFloat("27.8675309") // Results in a float value of 27.86753

Я не уверен, что такое «десятичное представление» преобразователя IEEE (это число с плавающей запятой?), Но я ожидаю, что оно даст мне максимально возможное число, которое:

  1. является значением с плавающей запятой
  2. Не превышает введенное мной исходное значение

Я ожидаю, что Java будет вести себя аналогичным образом, то есть я ожидаю, что строка кода, приведенная выше, будет возвращать значение с плавающей запятой, равное 27.8675308, или даже большее значение с плавающей запятой, которое ближе к моему исходному вводу вместо просто сбрасывать десятичные разряды. Что мне здесь не хватает?

Ответы [ 2 ]

9 голосов
/ 31 января 2012

Это как ожидалось.

Если вы посмотрите двоичное представление 27.8675309 (27.867530822753906 как двойное):

01000001110111101111000010110100

следующее наибольшее значение:

01000001110111101111000010110101

, что дает 27,867533 (27,86753273010254 как двойное), и следующее наименьшее значение:

01000001110111101111000010110011

, которое дает 27,867529 (27,867528915405273 как двойное)

Просто нетбитов в мантиссе Float достаточно для представления любого значения между ними, поэтому ваше значение округляется в десятичном виде до 27,867530

1 голос
/ 31 января 2012

Как упоминал Алнитак, у вас закончились биты. Вы можете использовать Double для более высокой точности. Double реализует 64-разрядную IEEE 754 с плавающей запятой, тогда как Float реализует 32-разрядную IEEE 754 с плавающей запятой.

...