У меня есть код для расчета процентной разницы между двумя номерами - (oldNum - newNum)/oldNum * 100;
- где оба числа: double
s. Я ожидал, что мне придется добавить какую-то проверку/обработку исключений, если oldNum равно 0. Однако, когда я выполнил тестовый прогон со значениями 0.0 для oldNum и newNum, выполнение продолжалось, как будто ничего не произошло, и ошибка не была выбрана. Выполнение этого кода с помощью int
s определенно вызовет арифметическое деление на ноль. Почему Java игнорирует это, когда дело доходит до double
?Почему Java не генерирует исключение при делении на 0,0?
ответ
В результате деления на ноль, математически говоря, не определено , который может быть выражен с поплавком/двойной (как NaN
- не число), это, однако, не так в любом фундаментальном смысле.
Как целое число должно содержать определенное числовое значение, при обращении с ними необходимо делить на деление на ноль.
Точно. Это определено в Java Language Spec здесь: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 –
Я попытался вывести результат, и это значение NaN. Означает ли это, что ints не может удерживать NaN? – froadie
, но это случай «0.0/0.0», который является NaN. –
Способ, которым хранится двойной, сильно отличается от int. См. http://firstclassthoughts.co.uk/java/traps/java_double_traps.html для более подробного объяснения того, как Java обрабатывает двойные вычисления. Вы также должны прочитать цифры с плавающей запятой, в частности концепцию Not a Number (NaN).
Если вам интересно узнать больше о представлении с плавающей запятой, я бы посоветовал прочитать this document (формат Word, извините). Он вникает в двоичное представление чисел, что может быть полезно для вашего понимания.
Java-float
и double
типы, как и почти любой другой язык, там (и в значительной степени любое оборудование FP блок), внедрить стандарт IEEE 754 для точки математики с плавающей, который предусматривает деление на ноль, чтобы вернуть специальный «бесконечность» значение , Выброс исключения фактически нарушил бы этот стандарт.
Целочисленная арифметика (реализованная как two's complement представление Java и большинства других языков и аппаратных средств) отличается и не имеет специальных значений бесконечности или NaN, поэтому бросание исключений - полезное поведение.
Правильный ответ на этот вопрос должен быть таким. Мне нужно было знать, почему 'float' и' double' не вызывают исключения. Благодарю. –
Это должен быть обозначенный правильный ответ.Ответ, который в настоящее время отмечен как правильный, не отвечает на вопрос, и не дает понять, что Java соответствует IEEE 754. – Necrototem
Хотя разработчики 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)
Если разделить дважды на 0, JVM покажет бесконечность.
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
консоли:
Infinity
Если разделить ИНТ на 0, то JVM бросит Арифметика исключение.
public static void main(String [] args){ int a=10; System.out.println(a/0); }
консоли:
Exception in thread "main" java.lang.ArithmeticException:/by zero
Но если мы разделим ИНТ на 0.0, то JVM будет показывать бесконечность:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
консоли:
Infinity
Это связано с тем, что JVM автоматически вводит cast int double, поэтому мы получаем бесконечность вместо ArithmeticException.
- 1. Почему java parseInt генерирует исключение?
- 2. Какое исключение выбрасывается при делении на ноль?
- 3. Java: Распечатывает 0.0 при делении
- 4. Почему EF генерирует исключение?
- 5. Почему метод close() в java генерирует исключение?
- 6. Почему .split ("\\") генерирует исключение?
- 7. Почему ObservableCollection генерирует исключение при изменении?
- 8. Почему компилятор генерирует сдвиг вправо на 31 бит при делении на 2?
- 9. Java - Can not Catch ArithmeticException при делении на ноль
- 10. Почему Java-метод не генерирует исключение в тестовом классе?
- 11. XmlReader.GetAttribute() не генерирует исключение
- 12. Почему этот список не генерирует исключение ClassCastException?
- 13. Почему reader.GetOrdinal ("FieldName") генерирует исключение?
- 14. Почему этот код ruby не генерирует исключение?
- 15. Почему этот код генерирует исключение
- 16. Почему string.match (...) [0] генерирует исключение?
- 17. Почему SetValue Reflection генерирует исключение?
- 18. Почему Class.newInstance всегда генерирует исключение?
- 19. Почему этот код генерирует исключение?
- 20. Почему HttpServlet генерирует исключение IOException?
- 21. Почему мой код генерирует исключение NullPointerException?
- 22. Почему свойство Set генерирует исключение StackOverflow?
- 23. PetaPoco не генерирует исключение
- 24. Почему этот массив int генерирует исключение IndexOutOfRangeException?
- 25. Javascript Object.seal() не генерирует исключение
- 26. Почему кеш-кеш asp.net генерирует исключение?
- 27. Почему этот код генерирует исключение NullPointerException?
- 28. Округление при делении целых чисел Java
- 29. Почему HttpClient генерирует исключение при успешном выполнении запроса?
- 30. Почему моя форма генерирует исключение OutOfMemory при попытке загрузить изображение?
Хороший вопрос - несогласованность между целым и двойным поведением добавляет путаницу и хлопот. –
Возможный дубликат [Почему деление на ноль с номерами с плавающей запятой (или двойной точностью) не вызывает java.lang.ArithmeticException:/на ноль в Java] (http://stackoverflow.com/questions/12954193/why-does- – Raedwald
@ Raedwald - учитывая, что этот вопрос был отправлен за 2 1/2 года до того, с которым вы связались, я бы сказал, что вопрос - это (возможно) дубликат этого :) – froadie