Почему это простое деление между двумя числами не работает с Java? - PullRequest
0 голосов
/ 26 апреля 2010
System.out.println((26.55f/3f));

или

System.out.println((float)( (float)26.55 / (float)3.0 ));

и т.д.

возвращает результат 8.849999. не 8,85, как следует.

Может кто-нибудь объяснить это или мы все должны избегать использования поплавков?

Ответы [ 4 ]

8 голосов
/ 26 апреля 2010

Что должен знать каждый программист об арифметике с плавающей точкой :

В: Почему мои цифры не равны 0,1 + 0,2? добавить до хорошего раунда 0,3, и вместо этого я получаю странный результат, как +0,30000000000000004

A: Потому что внутри, компьютеры используют формат (двоичная с плавающей точкой), что не может точно представить число например, 0,1, 0,2 или 0,3.

Подробные объяснения на сайте, на который ведут ссылки

2 голосов
/ 26 апреля 2010

Взгляните на статью Википедии о числах с плавающей точкой, в частности, раздел Проблемы точности .

Тот факт, что числа с плавающей точкой не могут точно представлять все действительные числа, и чтоОперации с плавающей точкой не могут точно представлять истинные арифметические операции, что приводит ко многим удивительным ситуациям.Это связано с конечной точностью, с которой компьютеры обычно представляют числа.

В статье приведено несколько примеров, которые должны обеспечить большую ясность.

2 голосов
/ 26 апреля 2010

Объяснить легко: с плавающей запятой это двоичный формат, и поэтому он может представлять только те значения, которые кратны 1.0 / (2 to the Nth power) для некоторого натурального целого N. 26.55 не имеет этого свойства, поэтому не может быть точно представлено.

Если вам нужно точное представление (например, ваш код о бухгалтерии и деньгах, где важна каждая доля цента), тогда вы действительно должны избегать поплавков в пользу других типов, которые гарантируют точное представление нужных вам значений (в зависимости в вашем приложении, например, может быть достаточно просто вести весь учет в терминах целых чисел центов). Поплавки (при правильном использовании и рекомендации!

0 голосов
/ 26 апреля 2010

Ну, нам всем следует избегать использования поплавков везде, где это реально, но это история для другого дня.

Проблема в том, что числа с плавающей запятой не могут точно представлять большинство чисел, которые мы считаем тривиальными при представлении. 8.850000, вероятно, не может быть представлен в точности поплавком; и, возможно, не в два раза. Это потому, что они не на самом деле десятичные числа; но двоичное представление.

...