두 숫자 ((oldNum - newNum)/oldNum * 100;
)의 백분율 차이를 계산하는 코드가 있습니다. 두 숫자가 모두 double
입니다. oldNum이 0 일 때를 대비하여 일종의 검사/예외 처리를 추가해야 할 것으로 예상됩니다. 그러나 oldNum과 newNum 모두 0.0의 값으로 테스트를 실행했을 때 아무 일도 일어나지 않았고 오류가 발생하지 않은 것처럼 실행이 계속되었습니다. int
으로이 코드를 실행하면 확실히 0으로 나누기 예외가 발생합니다. double
s와 관련하여 Java가이를 무시하는 이유는 무엇입니까?0.0으로 나누면 Java가 예외를 throw하지 않는 이유는 무엇입니까?
답변
0으로 나눗셈의 결과를 수학적으로 말하면, 인, 이중 플로트 /로 표현 될 수 정의 (NaN
로 - 숫자가 아닌)가 없다 그러나 잘못 근본적인 의미이다.
정수에는 특정 숫자 값이 있어야하므로이를 처리 할 때는 0으로 나눈 값에 오류를 던져야합니다.
바로. 이것은 Java Language Spec에서 다음과 같이 정의됩니다. http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 –
결과를 출력하려했는데 NaN 값입니다. int가 NaN을 보유 할 수 없다는 의미입니까? – froadie
하지만 이것은 0.0/0.0의 경우이며 NaN입니다. –
double이 저장되는 방식은 int와 완전히 다릅니다. Java가 이중 계산을 처리하는 방법에 대한 자세한 설명은 http://firstclassthoughts.co.uk/java/traps/java_double_traps.html을 참조하십시오. 부동 소수점 숫자, 특히 Not a Number (NaN)의 개념을 읽어야합니다.
부동 소수점 표현에 대해 더 자세히 알고 싶다면 this document (Word 형식, 죄송합니다)을 읽는 것이 좋습니다. 그것은 당신의 이해에 도움이 될 수있는 숫자의 2 진 표현을 탐구합니다.
자바의 float
및 double
유형, 거기에 (그리고 거의 모든 하드웨어 FP 장치) 거의 다른 언어와 같은 특정 "무한대"값을 반환 0으로 나누기를 의무화 부동 소수점 연산에 대한 IEEE 754 표준을 구현 . 예외를 던지면 실제로 그 표준을 위반하게됩니다.
정수 계산 (Java 및 대부분의 다른 언어와 하드웨어에 의해 two's complement 표현으로 구현 됨)이 다르며 특별한 무한대 또는 NaN 값이 없으므로 예외를 throw하는 것이 유용한 동작입니다. 그들은 Double.INFINITY
, NaN
, -0.0
및이를 포함하는 산술 계산을 지배하는 다른 규칙에 충분한주의를 지불하지 않는 부동 소수점 연산을하는 동안
이 질문에 대한 적절한 대답은 다음과 같습니다. 나는 float과 double이 예외를 발생시키지 않는 이유를 알아야했다. 감사. –
표시된 정답이어야합니다.현재 올바른 것으로 표시된 대답은 질문에 답하지 않으며 Java가 IEEE 754를 따르고 있음을 분명히하지도 않습니다. – Necrototem
비록 자바 개발자는 이중 원시 형과 Double
클래스에 대해 알고.
이 질문에 대한 간단한 대답은 ArithmeticException
을 던지고 Double.INFINITY
을 반환하지 않는다는 것입니다. 또한 x == Double.NaN
은 x
자체가 NaN
인 경우에도 항상 false
으로 계산됩니다.
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); }
콘솔 : 당신은 0으로 INT를 나누면
Infinity
, 다음 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으로 INT를 분할하는 경우, 다음 JVM이 표시됩니다 무한대 :
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
콘솔 :
Infinity
JVM이 cast int를 double 형으로 자동 입력하므로 ArithmeticException 대신 무한대가됩니다.
좋은 질문 - 정수와 이중 동작 간의 불일치로 인해 혼란과 번거 로움이 추가됩니다. –
[왜 부동 소수점 (또는 배정 밀도) 숫자가있는 0으로 나눗셈이 java.lang.ArithmeticException :/Java에서 0으로 throw되지 않는가?] (http://stackoverflow.com/questions/12954193/why-does- 0으로 나누기 - 부동 소수점 또는 이중 정밀도 숫자가 아님) – Raedwald
@ Raedwald -이 질문이 연결된 사람보다 2 년 반 전에 게시되었다고 생각하면이 질문은 (가능)이 하나의 사본 :) – froadie