У меня есть код для вычисления процентной разницы между 2 числами - (oldNum - newNum) / oldNum * 100;
- где оба из чисел double
s. Я ожидал должным быть добавлять своего рода проверку / обработка исключений в случае, если oldNum 0. Однако, когда я сделал тестовый прогон со значениями 0,0 и для oldNum и для newNum, выполнение, продолженное, как будто ничего не произошло, и никакая ошибка не была брошена. Выполнение этого кода с int
s определенно вызвал бы арифметическое исключение деления на нуль. Почему Java игнорирует его когда дело доходит до double
s?
Математически результатом деления на ноль является undefined , что может быть выражено с помощью числа с плавающей запятой / двойного (как NaN
- не число), это не однако ошибочен в любом фундаментальном смысле.
Поскольку целое число должно содержать определенное числовое значение, при делении на ноль при работе с ними должна возникать ошибка.
Типы Java float
и double
, как и практически любой другой язык (и практически любое оборудование FP), реализуют стандарт IEEE 754 для математических операций с плавающей запятой, который требует деления на ноль для возврата специального «бесконечного» значения. Создание исключения фактически нарушит этот стандарт.
Целочисленная арифметика (реализованная как представление с дополнением до двух Java и большинством других языков и аппаратных средств) отличается и не имеет специальной бесконечности или значений NaN, поэтому создание исключений является полезным поведением.
Способ хранения double сильно отличается от int. См. http://firstclassthoughts.co.uk/java/traps/java_double_traps.html для более подробного объяснения того, как Java обрабатывает двойные вычисления. Вы также должны прочитать о числах с плавающей запятой, в частности о концепции Not a Number (NaN) .
Если вы хотите узнать больше о представлении с плавающей запятой, я бы посоветовал прочитать этот документ (формат Word, извините). Он углубляется в двоичное представление чисел, что может быть полезно для вашего понимания.