printf ()의 부동 소수점 서식
-
16-09-2019 - |
문제
데이터가 다양한 소수점으로 저장되는 플로트 배열이있어 일부는 123.40000
, 123.45000
, 123.45600
... 이제이 값이 10 대가없는 문자열에 인쇄하고 싶다면 printf()
그래서 그들은입니다 123.4
, 123.45
, 123.456
, 결국 그 0이 없으면. 이게 가능해? 그렇다면 어떻게?
해결책
%g 형식을 사용하십시오 :
printf( "%g", 123.4000 );
인쇄물
123.4
후행 0이 제거되지만 불행히도 분수 부분이 0 인 경우 소수점도 마찬가지입니다. 실제로 printf ()를 사용하여 원하는 것을 실제로 수행하는 방법이 있는지 모르겠습니다. 아마도 이와 같은 것이 가장 좋은 방법이라고 생각합니다.
#include <stdio.h>
#include <math.h>
void print( FILE * f, double d ) {
if ( d - floor(d) == 0.0 ) {
fprintf( f, "%g.", d );
}
else {
fprintf( f, "%g", d );
}
}
int main() {
print( stdout, 12.0 );
print( stdout, 12.300 );
}
다른 팁
나는 이것이 얼마나 해킹되는지 모르겠지만 :
float f = 124.000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
보고 124.0
.
float f = 124.123000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
보고 124.123
.
사용 %g--
정상 또는 지수 표기법으로 더블을 인쇄하십시오. 'g'는 소문자 문자를 사용하고 'g'는 상류 문자를 사용합니다. 이 유형은 소수점의 오른쪽에있는 무의미한 제로가 포함되지 않는다는 점에서 고정점 표기법과 약간 다릅니다. 또한 소수점은 정수에 포함되지 않습니다.
(충분히 큰) 버퍼로 인쇄하십시오. 버퍼를 인쇄하고 ... '.'
버퍼에서 점을 인쇄하십시오.
char buf[100];
sprintf(buf, "%g", val);
printf("%s", buf);
if (strchr(buf, '.') == NULL) putchar('.');
편집하다
표준은 #
깃발:
# 결과는``대체 양식 ''으로 변환됩니다. [...] a, a, e, e, f, f, g 및 g 변환의 경우, 부동 소수점 숫자를 변환 한 결과에는 숫자가 없더라도 항상 소수점 문자가 포함됩니다. [...] G 및 G 변환의 경우 결과에서 후행 0이 제거되지 않습니다. [...
...하지만 당신은 후행 0을 얻습니다 :(