Вместо 27.0 Math.pow(3.0,3.0) возвращает 26.999999999999993. В чем проблема?
Asked
Active
Viewed 79 times
-4
-
2Ошибка стандарта IEEE 754 - двоичные вычисления с плавающей точкой – vikttur_Stop_RU_war_in_UA Oct 13 '16 at 10:50
1 Answers
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
-
-
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