2012-04-26 3 views
5

double 값을 UNIX에서 sprintf()을 사용하여 문자열로 변환하는 중 하나의 특정 문제가 있습니다.sprintf double 값 서식 지정

double a = 0.009984354523452; 
double b = 0.01; 

변환하는 동안, 내가 사용하고 :

sprintf(somestringvar, "Double value : %.15f \n", a); 
sprintf(diffstringvar, "Double value : %.15f \n", b); 

문자열로 변환 할

예를 들어

나는 두 개의 값을 가지고있다.

내 문제는 'a'이고, 값이 제대로 인쇄되고 있지만 'b'값의 경우 꼬리 끝에 0이 추가됩니다. 'a'와 'b'를 정확한 값으로 표시하는 일반적인 방법을 제공해주십시오.

+1

나는 이런 종류의 일에 std :: ostringstream을 사용할 것이다. – Robinson

+1

그리고 일반적으로'sprintf()'는 버퍼 오버런을 일으킬 수 있으므로 사용하지 마십시오. 대신에'snprintf()'를 사용하거나 Microsoft에서 제공하는'_s' "안전한"버전 중 하나를 사용하십시오. 추신. 스택 오버플로에 오신 것을 환영합니다! –

+0

안녕하세요, 조속한 답변에 감사드립니다. ostringstream 전체 정밀도를 복용하지 않습니다. 값은 0.009976으로 만 인쇄됩니다. snprintf()를 사용할 수는 있지만 값을 올바르게 인쇄하는 동안 문제가 발생합니다. – sandy

답변

8

printf에 소수점 이하 15 자 (%.15f)를 인쇄하라고 지시했기 때문에 b를 인쇄 할 때 0이됩니다. 이는 순종적입니다. "정확한"것을 얻으려면 단순한 %g으로 더 운이 좋을 것입니다.


[최근 의견에 따라 업데이트]

상황이 정말 당신이 "정확한"무슨 뜻인지에 따라 달라집니다. 정확히 말하면 "사용자가 원래 입력 한 내용"을 의미하는 경우 이중이 최선의 선택이 아닐 수도 있습니다. 아마도 값을 문자열로 저장 한 다음 연산에서 사용할 필요가있을 때 double로 변환하면됩니다. 텍스트 기반 십진수가 double로 변환되면 일반적으로 더 이상 텍스트와 정확히 동일하지 않습니다. printf() 또는 ostream은 정확하게 double이 보유하고있는 것 (그리고 때로는 운이 좋고 인쇄 된 것은 원래 값과 동일하게 보임)을 정확하게 인쇄하지만, double 자체는 더 이상 실제 원래 값을 보유하지 않습니다. 그리고 실제로 그것은 결코하지 않았습니다.

또는 두 배로 본질적으로 근사치가 아닌 정확한 숫자 구현을 선호 할 수 있습니다. 예를 들어, MySQL은 NUMERIC and DECIMAL 타입을 가지고 있습니다. 정밀도를 지원하기 때문에 미리 정수와 소수 자릿수를 지정해야합니다. 이것은 arbitrary precision arithmetic라고하며 C/C++에서이를 수행하기위한 라이브러리가 있습니다.

+0

답장을 보내 주셔서 감사합니다. 제원 추가에 대한 논리적 인 부분을 이해할 수 있습니다. 하지만 문제는 런타임에 데이터베이스에서 값을 읽어야합니다. 위의 그림과 같이 값은 모든 유형이 될 수 있으므로 정확한 값을 인쇄하는 일반적인 방법을 찾고 있습니다. 나는 '% g'을 시도해도 'a'값을 정규화하고 있습니다. 0.009976 – sandy

+0

사람들은 왜 이것을 계속 투표합니까? 문제가있을 경우 의견을 나누어 개선하거나 자신의 답변을 대체 할 수 있습니다. –