Почему Java не создает исключение при делении на 0.0?


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

5 67

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.

это может быть полезно для вас.

при делении на ноль ( 0 или 0.00 )

  1. если вы разделите double на 0, JVM покажет бесконечность.

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }