부동 소수점은 실제로는 2 진수 (2 진수)로 표현 된 가수입니다. 이 결과로 0.1
십진수 (일명 분수 1/10
)는 부동 소수점으로 정확하게 표현 될 수 없습니다.
이유는 정확히 1/3
을 고정 소수점 이하 자릿수로 표시 할 수 없습니다. 이는 무한 반복되는 값인 0.3333333.....
이며, 제한된 수의 곳으로자를 경우 오류가 발생합니다. 유일한 차이점은 1/10
이 기본 2에서 무한히 반복되는 값이라는 것입니다. 따라서 한정된 수의 2 진수로 정확히 표현 될 수 없습니다.
이러한 방식으로 영향을받는 다른 값 (예 : 0.2
, 0.6
등)이 분명히 있습니다. 이러한 오류는 부동 소수점 표현의 고유 한 특성입니다. 또는 다른 말로 표현하면 부동 소수점은 근사값 (정밀도가 잠재적으로 부족한 값)을 나타냅니다. 그리고 일련의 계산을 수행 할 때 값의 오류가 전파됩니다.
0.1
을 부동 소수점 (및 다른 값)으로 정확하게 표현할 수있는 방법이 없기 때문에 정확하게 부동 소수점 값을 데이터베이스에 저장하고 정확하게 0.1
값을 얻는 방법은 없습니다.
당신은
#include <sstream>
#include <iomanip>
#include <string>
std::ostringstream o;
o << std::fixed << std::setprecision(2) << result;
std::string s=o.str();
로, 출력의 정밀도를 제한하는 방법으로 값을 인쇄 시도 할 수 곰을 염두에 포맷하는 방법을
result
제어 (예를 들어,이 경우에 문자열 출력에).
result
의 값은 변경되지 않습니다.
개념적으로 필드가 숫자가 아닌 문자열을 나타내는 경우 s
문자열을 데이터베이스에 저장할 수 있습니다.
왜 이런 일이 일어나는지 궁금 할 때가 있습니다 : [부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/q/588004/669576). –
'47.6'값은 어떤 2 진 부동 소수점 유형에도 존재하지 않으므로 근사값 만 얻을 수 있습니다. 데이터베이스 유형이 무엇입니까? – hvd
모든 프로그래머가 부동 소수점 숫자를 메모리에 저장하는 방법에 대해 알아보십시오. – DeiDei