Issue
지정된 소숫점 아랫자리를 버리고 출력하려고 했다.
0.60000을 둘째짜리까지 출력하려면 0.60이 나와야하는데 0.59가 나와버렸다.
정확하지않은 실수 자료형 때문에 생긴 문제같다.
Solution
double n: 연산할 숫자
int valid 변수: 버릴 지점.
double multiplier = pow(10, valid);
result = floor(n * multiplier) / multiplier;
여기서 문제가
n =0.60000 이고 mutiplier =100 이면
n * multiplier을 하면 599.999가 나온다는게 문제다.
실수 연산에서 문제가 생기는 것으로 보고
n이 정확한 0.6이 아니라서 생기는 문제라고 판단했다.
아주 뒷자리까지 출력해보면 0.60000000007 이렇게 되어있을거다.
그래서 정확한 값으로 만들어주기위해 정수를 문자열로 변환하면서 뒤를 잘라내는 작업을 한번 거쳤다.
그렇게 하니 연산 결과가 정상적으로 나왔다.
CString str;
str.Format(_T("%.6f"), v); //소숫점 6자리까지만 떼오기
v = _ttof(str);
double multiplier = pow(10, valid);
v = floor(v * multiplier) / multiplier;
'◼️C++' 카테고리의 다른 글
[C++] 함수다중정의(오버로딩), 템플릿 함수 (0) | 2023.09.05 |
---|---|
[C++] 디폴트 매개변수 (0) | 2023.09.05 |
[C++] 범위 기반 for 문 for(auto n : nList) (0) | 2023.08.31 |
[C++] 참조자 형식 int &n = a; (0) | 2023.08.31 |
[C++] 메모리 동적 할당. new(), delete() (0) | 2023.08.31 |