IT박스

0.0으로 나눌 때 Java에서 예외가 발생하지 않는 이유는 무엇입니까?

itboxs 2020. 11. 7. 09:07
반응형

0.0으로 나눌 때 Java에서 예외가 발생하지 않는 이유는 무엇입니까?


두 숫자 사이의 백분율 차이를 계산하는 코드가 있습니다 (oldNum - newNum) / oldNum * 100;. 두 숫자 모두 doubles입니다. oldNum이 0 인 경우 일종의 검사 / 예외 처리를 추가해야 할 것으로 예상했습니다. 그러나 oldNum과 newNum 모두에 대해 0.0 값으로 테스트 실행을했을 때 아무 일도 일어나지 않고 오류가 발생하지 않는 것처럼 실행이 계속되었습니다. 이 코드를 ints로 실행 하면 산술 0으로 나누기 예외가 발생합니다. doubles와 관련하여 Java가이를 무시하는 이유는 무엇 입니까?


0으로 나눈 결과는 수학적으로 말하면 undefined 이며 float / double ( NaN숫자가 아님) 로 표현 될 수 있지만 근본적인 의미에서 잘못된 것은 아닙니다.

정수는 특정 숫자 값을 보유해야하므로 처리 할 때 0으로 나누면 오류가 발생해야합니다.


Java floatdouble유형은 다른 언어 (및 거의 모든 하드웨어 FP 장치)와 마찬가지로 부동 소수점 수학을위한 IEEE 754 표준을 구현합니다.이 표준은 0으로 나누면 특별한 "무한"값을 반환해야합니다. 예외를 던지는 것은 실제로 그 표준을 위반하는 것입니다.

정수 산술 ( Java 및 대부분의 다른 언어 및 하드웨어에 의해 2의 보수 표현으로 구현 됨 )은 다르며 특별한 무한대 또는 NaN 값이 없으므로 예외를 던지는 것이 유용한 동작입니다.


double이 저장되는 방식은 int와 상당히 다릅니다. Java가 이중 계산을 처리하는 방법에 대한 자세한 설명 http://firstclassthoughts.co.uk/java/traps/java_double_traps.html참조 하십시오 . 또한 부동 소수점 숫자, 특히 NaN (Not a Number) 개념을 읽어야합니다 .

부동 소수점 표현에 대해 더 배우고 싶다면 이 문서를 읽는 것이 좋습니다 (Word 형식, 죄송합니다). 이해하는 데 도움이 될 수있는 숫자의 이진 표현을 탐구합니다.


자바 개발자가 이중 원시 형과에 대해 알고 있지만 Double부동 소수점 연산을하는 동안, 클래스 그들에 충분한주의를 지불하지 Double.INFINITY, NaN, -0.0및이를 포함하는 산술 계산을 지배하는 다른 규칙.

이 질문에 대한 간단한 대답은 던지고 ArithmeticException돌아 오지 않을 것이라는 것입니다 Double.INFINITY. 또한 비교 는 자체가라고 해도 x == Double.NaN항상로 평가됩니다 .falsexNaN

테스트 할 경우 xA는 NaN하나의 메소드 호출을 사용한다 Double.isNaN(x)주어진 숫자가 NaN인지 아닌지 확인 할 수 있습니다. 이것은 매우 가까이 NULL에서 SQL.

당신에게 도움이 될 수 있습니다.


0으로 나눈 경우 (0 또는 0.00)

  1. double을 0으로 나누면 JVM은 Infinity 를 표시 합니다.

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

    콘솔: Infinity

  2. int를 0으로 나누면 JVM은 Arithmetic Exception을 발생 시킵니다.

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

    콘솔: Exception in thread "main" java.lang.ArithmeticException: / by zero

  3. 그러나 int를 0.0으로 나누면 JVM은 Infinity를 표시합니다.

    public static void main(String [] args){ int a=10; System.out.println(a/0.0); }

    콘솔: Infinity

이는 JVM이 자동으로 int를 double로 캐스트하기 때문에 ArithmeticException 대신 무한대를 얻습니다.

참고 URL : https://stackoverflow.com/questions/2381544/why-doesnt-java-throw-an-exception-when-dividing-by-0-0

반응형