Почему Java не создает исключение при делении на 0.0?
у меня есть код для вычисления процентной разницы между 2 числами - (oldNum - newNum) / oldNum * 100;
- где оба числа double
ы. Я ожидал, что придется добавить какую-то проверку / обработку исключений в случае oldNum равен 0. Однако, когда я выполнил тестовый запуск со значениями 0.0 как для oldNum, так и для newNum, выполнение продолжалось, как будто ничего не произошло, и ошибка не была выдана. Запуск этого кода с помощью int
s определенно вызовет исключение арифметического деления на ноль. Почему Java игнорирует его когда дело доходит до double
s?
5 ответов:
результат деления на ноль, математически говоря,неопределено, который может быть выражен с помощью float / double (как
NaN
- Не число), это, однако, не является неправильным в любом фундаментальном смысле.поскольку целое число должно содержать определенное числовое значение, ошибка должна быть брошена на деление на ноль при работе с ними.
Java
float
иdouble
типы, как и почти любой другой язык (и почти любой аппаратный блок FP), реализуют IEEE 754 стандарт для математики с плавающей запятой, которая требует деления на ноль, чтобы вернуть специальное значение "бесконечности". Создание исключения фактически нарушило бы этот стандарт.целочисленная арифметика (реализована как дополнение представление Java и большинства других языков и оборудования) отличается и не имеет специальных значений бесконечности или NaN, поэтому выбрасывание исключений является полезным поведением там.
способ хранения двойника сильно отличается от int. См.http://firstclassthoughts.co.uk/java/traps/java_double_traps.html для более подробного объяснения того, как Java обрабатывает двойные вычисления. Вы также должны прочитать о числах с плавающей запятой, в частности понятие не число (NaN).
Если вы заинтересованы в получении дополнительной информации о представлении с плавающей точкой, я бы посоветовал читать документ (слово , огорченный.) Он углубляется в двоичное представление чисел, что может быть полезно для вашего понимания.
хотя разработчики Java знают о двойном примитивном типе и
Double
класс, при выполнении арифметики с плавающей запятой они не уделяют достаточного вниманияDouble.INFINITY
,NaN
,-0.0
и другие правила, которые регулируют арифметические вычисления с их участием.самый простой ответ на этот вопрос заключается в том, что он не бросит
ArithmeticException
и возвратDouble.INFINITY
. Кроме того, обратите внимание, что сравнениеx == Double.NaN
всегда оценивает вfalse
, даже еслиx
сам по себе являетсяNaN
.чтобы проверить, если
x
этоNaN
, следует использовать вызов методаDouble.isNaN(x)
чтобы проверить, является ли данный номер NaN или нет. Это очень близко кNULL
наSQL
.это может быть полезно для вас.