int
각 문자를 캐스트 int
하고 해당 지수를 곱하여 사용자 입력을 문자열에서로 변환하려고했습니다 . 결과 값을 int
변수 에 할당해야 할 때까지 모든 것이 올바르게 작동합니다 . 할당 된 값이 100에서 1000 사이 일 때 항상 올바른 값보다 하나 적습니다. 즉, int k=0; k+=100;
k를 인쇄하면 99가 표시됩니다. 그러나 제대로 k+=1000
작동합니다.
내가 찾은 해결책은 승수와 승수의 순서를 변경하는 것이지만이 상황의 원인은 아직 알려져 있지 않습니다.
string k_input;
cin >> k_input;
int k = 0;
for (int i = 0; i < k_input.length(); i++)
{
cout << (k_input[i] - '0') << " " << pow(10, (k_input.length() - i) - 1) << endl;
k += (k_input[i] - '0') * pow(10, k_input.length() - i - 1);
}
즉 123을 입력하면 출력은 123이되지만 대신 122가 표시됩니다.
그리고 1221을 입력하면 예상대로 1221이 표시됩니다.
컴파일러 및 / 또는 플랫폼별로 문제가 될 수있는 문제는 double
계산 결과를 int
값으로 변환 할 때 거의 확실하게 '반올림'오류 입니다. lround
함수 (에 정의 됨 <cmath>
) 를 사용하여이 문제를 해결할 수 있습니다 .
k += lround((k_input[i] - '0') * pow(10, k_input.length() - i - 1));
덧붙여서 컴파일러 경고 를 켜면 이와 같은 문제가 강조됩니다! 코드의 경우 Visual Studio에서 다음과 같이 표시되었습니다.
warning C4244: '+=': conversion from 'double' to 'int', possible loss of data
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다