2016-10-14 4 views
1

와 분수에 대해 서로 다른 답변을 주는가 내가하는 일에 따라. 왜 괄호의 배치가 곱셈에 중요하지 않아야하는지 모르겠다. 어떤 통찰력을 주셔서 감사합니다!왜 자바 내가이를 계산했다 다른 괄호

System.out.println (Double.toString (1000 * 1 * 5000 * 500/(10000 * 24645.16239360158)));

출력

반드시 잘못된위한

-7.283243937828597

에서 System.out.println (가지는 Double.toString (1000 음수이기 때문에 * 5000 * (1 24645.16239360158 * 500/(10000)))); 한편

는 (정확한)

10.143978603480635

기본적 번째 경우 우리가 계산 한 후 (1000)에 의해 결과를 곱 출력하고, 그 든 작동한다.

감사합니다.

+8

'1000 * 1 * 5000 * 500''int'에 맞지 않습니다. – user2357112

답변

1

이 표현식 1000 * 1 * 5000 * 500/(10000 * 24645.16239360158)은 1000 * 1 * 5000 * 500을 계산하면 결과는 -1794967296으로 오버플로됩니다.

이 표현식 1000 * (1 * 5000 * 500/(10000 * 24645.16239360158)) 오버플로가 발생하지 않습니다.

2

int * intint (5 * 5)을 산출해야합니다. int * doubledouble (5 * 5.0)을 산출합니다.

아마 알다시피, 이러한 데이터 형식은 다른 최대 크기와 저장 값을 가지고 있습니다. 당신은 정확한 경계에 대한 Integer.MAX_VALUEInteger.MIN_VALUE을 사용할 수 있습니다

enter image description here

:

다음은 그 중 일부입니다. 이러한 값을 초과해야하지만 int도 갖고 싶으면 클래스 BigInteger을 사용해야합니다. 임의의 큰 integers을 처리 할 수 ​​있습니다. 그렇지 않으면 overflow라고 할 때 Integer.MAX_VALUE + 1 일 때 결과는 Integer.MIN_VALUE이됩니다. 이 번호가 바이트 단위로 저장되는 방식을 기억하면 과 같이 +11000을 반환하지만 처음에는 1을 저장할 위치가 없으므로 인 000을 받게됩니다.

당신은 또한 당신이 5/2을 계산할 때 두 int 분할대로, 2.5하지만 2를 반환하지 않습니다 알고 있어야합니다, 결과는 또한 int 될 것입니다. double을 원할 경우 5/2.0 또는 (5 + 0.0)/2과 같은 작업을 수행해야합니다.

+2

프리미티브 유형의 MIN 및 MAX 값은 문제의 한 면일뿐입니다. 당신이 언급하지 않은 연산자 우선 순위 (이 경우 나눗셈 이전의 곱셈)는 OP가 혼란 스럽다는 것을 분명히 말합니다. 왜냐하면 실제로 연산자가 괄호의 위치가 곱셈에 중요하지 않아야한다는 말을하기 때문입니다. – walen

0

모든 표현식의 평가는 연산자 우선 순위 구문 분석기에 의해 수행됩니다. 우선 순위를 변경하려면 괄호를 사용해야합니다.

첫 번째 경우 '/'와 '*'는 동일한 우선 순위 table입니다.

'*'는 '/'보다 우선 순위가 높습니다. 그 이유는 출력으로 다른 값을 얻는 것입니다.

0

이것은 Java의 암시 적 형식 변환 때문입니다. 기본적으로 Java는 int를 사용합니다. user2357112가 주석 처리했기 때문에 숫자가 int에 비해 너무 큽니다.

첫 번째 버전을 사용하려면 "d"를 추가하여 Java에 이중을 사용하도록 지시하십시오.

더블 d = 1000d * 1 * 5000 * 500/(10000 * 24645.16239360158) System.out.println (d);

당신은 얻을 것이다 : 10.143978603480635