C++에서 정수끼리의 나눗셈에서 소수점이 버려지고 정수 값만 리턴되는 현상이 나타난다.
#include <iostream>
using namespace std;
int main() {
int dividend = 10;
int divisor = 3;
double result = dividend / divisor;
cout << result; // 3
return 0;
}
10 / 3의 결과를 10.3333... 으로 기대하지만 실제 출력은 3으로 나타난다. 소수점이 버려지는 이유는 C++의 데이터 타입과 관련이 있다. C++에서 데이터 타입은 정수형과 실수형으로 나뉘며, 각 타입은 서로 다른 방식으로 연산을 처리한다.
- 정수형 데이터 타입: int, short, long, long long, ...
- 실수형 데이터 타입: float, double, ...
정수형 피연산자들끼리의 나눗셈은 정수로 결과를 반환하도록 정의되어 있다. 반면 실수형 피연산자가 하나라도 있으면 자동으로 실수형 나눗셈을 수행하고 소수점까지 계산된 결과를 반환한다.
정수 나눗셈에서 소수점 이하 값을 포함한 결과를 얻는 방법
정수형 변수끼리의 나눗셈에서 소숫점 이하의 값을 포함한 결과를 얻고 싶다면 피연산자 중 적어도 하나를 실수형으로 변환해야 한다. 이는 명시적 캐스팅을 통해 해결할 수 있다.
#include <iostream>
using namespace std;
int main() {
int dividend = 10;
int divisor = 3;
double result = static_cast<double>(dividend) / divisor;
// double result = dividend / static_cast<double>(divisor);
cout << result; // 3.33333
return 0;
}
static_cast<double>(dividend)를 통해 dividend를 실수형으로 변환함으로써 실수 나눗셈을 수행하여 3.33333...이라는 값을 반환한다.
왜 캐스팅이 필요한가?
먼저 l-value와 r-value에 대해 알아보자.나눗셈 연산에서도 이 개념이 적용된다.
- l-value (left value): 메모리 주소를 가지며 표현식 이후에도 사라지지 않는 값. 명시적으로 선언하여 이름을 가지고 메모리에 저장되어 있어 계속 접근할 수 있다. dividend, divisor이 l-value에 해당된다.
- r-value (right value): 임시적으로 생성된 값이며 표현식 이후 사라지는 값. 프로그램 실행 중에 임시적으로 연산 결과를 저장하기 위해 레지스터에 존재할 수 있지만 메모리 주소를 가지지 않는다. dividend / divisor이 r-value에 해당된다.
실수 나눗셈에서 소수점 이하 값을 포함한 결과를 얻으려면 l-value인 피연산자를 실수형으로 캐스팅해야 한다. dividend 또는 divisor와 같은 l-value를 static_cast를 통해 실수형으로 변환하면, 그 값은 임시적으로 실수형 r-value로 처리된다. 이 변환 덕분에 C++은 실수형 나눗셈이 수행되어 소수점 이하 값이 포함된 결과를 얻게 된다.
'C++' 카테고리의 다른 글
구조체와 공용체의 차이 (3) | 2024.10.13 |
---|---|
[C++] N차원 배열 선언 방법 (0) | 2024.10.08 |
[C++] 시간초과 해결방법 (1) | 2024.09.20 |