1. 개요
나누기 연산자 (/)를 사용하여 Java에서 왼쪽 값을 오른쪽 값으로 나눌 수 있습니다. 예를 들어 int number = 10 / 5 입니다.
이 빠른 사용방법(예제)에서는 정수 나누기 연산에서 float 결과 를 얻는 방법을 살펴봅니다 .
2. 문제 소개
우선 간단하게 하기 위해 단위 테스트 어설션을 사용하여 이 사용방법(예제)의 계산 결과를 확인합니다.
우리는 a/b 와 같은 두 정수에 나누기 연산자를 적용할 때 a 가 b 로 균등하게 나누어지지 않더라도 항상 정수를 반환 한다는 것을 깨달았 을 것 입니다. 예를 들면 다음과 같습니다.
int i = 10 / 4;
assertEquals(2, i);
테스트를 실행하면 통과합니다. 따라서 10/4는 2.5 대신 2를 생성 합니다 . 또한 계산 결과를 float 변수에 할당하더라도 결과는 여전히 2입니다.
float x = 10 / 4;
assertEquals(2, x);
다음으로 먼저 왜 이런 일이 발생하는지 이해한 다음 원하는 float 결과(예: 이 경우 2.5) 를 얻는 방법을 알아봅시다 .
3. Java에서 두 정수를 나누면 항상 정수가 되는 이유는 무엇입니까?
Java에서 10 / 4 = 2인 이유를 이해하려면 나누기 연산자의 동작이 어떻게 정의되어 있는지 JLS(Java Language Specification) 의 나누기 연산자 섹션 을 확인해야 합니다 .
먼저 사양에 따르면 정수 나누기는 0으로 반올림됩니다 . 즉, 두 정수의 나눗셈 연산의 결과는 몫값뿐이다. 나머지는 포함되지 않습니다.
따라서 10/4를 계산하면 2.5 가 아닌 2가 됩니다.
다음 으로 두 정수를 나눌 수 없는 경우 예상되는 float 결과 를 얻는 방법을 살펴보겠습니다 .
4. 두 정수의 나눗셈 결과를 float로 만드는 방법은 무엇입니까?
이제 나누기 연산자가 두 정수와 함께 작동하는 방식을 이해했습니다. JLS는 또한 이진 숫자 승격 에서 기본 피연산자 변환 규칙을 정의했습니다 .
이진 숫자 승격은 * , / 및 % 연산자 에서 수행됩니다 . 따라서 나누기 연산은 피연산자 변환 규칙을 따릅니다.
다음으로 피연산자 변환 규칙을 자세히 살펴보겠습니다.
JLS에 따라 a/b 를 계산할 때 :
- 피연산자 중 하나가 double 유형이면 다른 피연산자는 double 로 변환됩니다 .
- 그렇지 않고 피연산자 중 하나가 float 유형이면 다른 피연산자는 float 로 변환됩니다 .
- 그렇지 않고 피연산자 중 하나가 long 형식이면 다른 피연산자는 long 으로 변환됩니다 .
- 그렇지 않으면 두 피연산자가 모두 int 유형으로 변환됩니다.
위의 규칙에 따라 a/b 연산 결과를 float 숫자 로 만들려면 적어도 하나의 피연산자가 float 유형이어야 합니다.
다음으로 하나의 피연산자를 float 로 캐스팅할 때 예상한 결과를 얻을 수 있는지 살펴보겠습니다 .
float x = (float) 10 / 4;
assertEquals(2.5, x);
float y = 10 / (float) 8;
assertEquals(1.25, y);
위의 테스트는 실행하면 통과합니다. 따라서 피연산자를 float 로 캐스팅 하면 나눗셈에서 float 결과 가 생성 됩니다.
5. 결론
이 빠른 기사에서는 Java에서 정수를 나누면 항상 정수가 되는 이유에 대해 설명했습니다.
또한 정수 나누기에서 예상되는 부동 소수점 결과 를 얻는 방법을 설명했습니다 . 이는 분할할 수 없는 경우에 특히 유용합니다.
늘 그렇듯이 기사에 제시된 모든 코드 스니펫은 GitHub에서 사용할 수 있습니다.