문제

데이터가 다양한 소수점으로 저장되는 플로트 배열이있어 일부는 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 );
}

다른 팁

나는 이것이 얼마나 해킹되는지 모르겠지만 :

http://codepad.org/e3q3pund

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을 얻습니다 :(

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top