-4

Вместо 27.0 Math.pow(3.0,3.0) возвращает 26.999999999999993. В чем проблема?

1 Answers1

2

Это не проблема, а вполне допустимое поведение. Дело в том, что множество действительных чисел не только бесконечно, но и непрерывно, поэтому, сколько бы мы не взяли бит, мы неизбежно столкнемся с числами, которые не имеют точного представления.

Поэтому вы получаете достаточно точный ответ, который близок к 27.0

akashihi
  • 156
  • Не согласен. Это проблема, которую нужно учитывать и научиться обходить. Тут-то ладно, а как быть бухгалтерам, у которых баланс падает из-за такого "допустимого поведения"? – vikttur_Stop_RU_war_in_UA Oct 13 '16 at 11:30
  • У каждого решения есть свои границы применимости и свои ограничения. Числа с плавающей запятой позволяют представлять достаточно большое подмножество действительных чисел, от 10^−308 до 10^308, но за это приходится платить точностью. Если же у вас чисто бухгалтерская задача, в которой числа строго десятичные, с двумя знаками после запятой, то, очевидно, это решание вам не подходит и надо использовать другое. – akashihi Oct 13 '16 at 11:33
  • Я комментировал Ваш ответ. У меня нет такой задачи, а о стандарте написал еще в первом комментарии. – vikttur_Stop_RU_war_in_UA Oct 13 '16 at 11:48
  • Почему тогда pow(9.0,1.5) возвращает 27.0? – Петр Oct 13 '16 at 15:47
  • https://habrahabr.ru/post/112953/ На доступно Хабре расписывали. Коротко: ошибка может появиться, а может и не появиться. Не случайно, зависит от значений и операций над ними – vikttur_Stop_RU_war_in_UA Oct 14 '16 at 06:41
  • @vikttur для бухгалтеров используйте BigDecimal. Особенности double широко известны. И как сказал @akashihi если это решение вам не подходит то надо использовать другое, а не учится обходить. – Anatoly Samokisha Oct 14 '16 at 07:53
  • Я писал о ом, что нужно знать и учитывать возможность ошибки. И спользовать другое - это один из способов "обходить". – vikttur_Stop_RU_war_in_UA Oct 14 '16 at 08:09