Почему Java не создает исключение при делении на 0.0?
у меня есть код для вычисления процентной разницы между 2 числами - (oldNum - newNum) / oldNum * 100; - где оба числа doubleы. Я ожидал, что придется добавить какую-то проверку / обработку исключений в случае oldNum равен 0. Однако, когда я выполнил тестовый запуск со значениями 0.0 как для oldNum, так и для newNum, выполнение продолжалось, как будто ничего не произошло, и ошибка не была выдана. Запуск этого кода с помощью ints определенно вызовет исключение арифметического деления на ноль. Почему Java игнорирует его когда дело доходит до doubles?
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.это может быть полезно для вас.