0.0으로 나눌 때 Java에서 예외가 발생하지 않는 이유는 무엇입니까?
두 숫자 사이의 백분율 차이를 계산하는 코드가 있습니다 (oldNum - newNum) / oldNum * 100;
. 두 숫자 모두 double
s입니다. oldNum이 0 인 경우 일종의 검사 / 예외 처리를 추가해야 할 것으로 예상했습니다. 그러나 oldNum과 newNum 모두에 대해 0.0 값으로 테스트 실행을했을 때 아무 일도 일어나지 않고 오류가 발생하지 않는 것처럼 실행이 계속되었습니다. 이 코드를 int
s로 실행 하면 산술 0으로 나누기 예외가 발생합니다. double
s와 관련하여 Java가이를 무시하는 이유는 무엇 입니까?
0으로 나눈 결과는 수학적으로 말하면 undefined 이며 float / double ( NaN
숫자가 아님) 로 표현 될 수 있지만 근본적인 의미에서 잘못된 것은 아닙니다.
정수는 특정 숫자 값을 보유해야하므로 처리 할 때 0으로 나누면 오류가 발생해야합니다.
Java float
및 double
유형은 다른 언어 (및 거의 모든 하드웨어 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
항상로 평가됩니다 .false
x
NaN
테스트 할 경우 x
A는 NaN
하나의 메소드 호출을 사용한다 Double.isNaN(x)
주어진 숫자가 NaN인지 아닌지 확인 할 수 있습니다. 이것은 매우 가까이 NULL
에서 SQL
.
당신에게 도움이 될 수 있습니다.
0으로 나눈 경우 (0 또는 0.00)
double을 0으로 나누면 JVM은 Infinity 를 표시 합니다.
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
콘솔:
Infinity
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
그러나 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
'IT박스' 카테고리의 다른 글
Hashtable의 제네릭 버전은 무엇입니까? (0) | 2020.11.07 |
---|---|
Python 함수 포인터 (0) | 2020.11.07 |
작동하지 않는 SQL NOT IN (0) | 2020.11.07 |
파이썬에서 문자열이 숫자로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2020.11.07 |
(xxxx xxxx xxxx xxxx)와 같은 신용 카드 입력을위한 UITextField 서식 지정 (0) | 2020.11.06 |