2010-03-04 10 views
4

안녕하세요이 표시됩니다 있도록 플로트 번호를 포맷 할 :형식 부동 소수점 수

decimal.fraction을

경우 소수점 = 최대 11 자리와 비율 = 최대 9 자리

분수 부분이 없으면 분수가 표시되지 않아야하며 십진수 부분에 11 자리 이상이면 과학적 형식으로 표시됩니다.

아무도 도와 줄 수 있습니까?

답변

3

이렇게 내부 형식이 있다고 생각하지 않습니다. 직접 포맷해야합니다 (테스트하지 않음) :

void fprintf_float(FILE* f, double value) { 
    if (-1e11 < value && value < 1e11) { 
    double d = fabs(value); 
    const char* sign = d > 0 ? "" : "-"; 
    double ipart, fpart; 
    char fpartstr[16]; 
    int pos; 
    fpart = modf(d, &ipart); 
    snprintf(fpartstr, 16, "%.9f", fpart); 
    for (pos = 10 /*strlen(fpartstr)-1*/; pos > 0; -- pos) 
     if (fpartstr[pos] != '0' && fpartstr[pos] != '.') 
     break; 
    fpartstr[pos+1] = '\0'; 
    fprintf(f, "%s%.11g%s", sign, ipart, fpartstr+1); 
    } else { 
    fprintf(f, "%.10e", value); 
    } 
} 
1

표준 라이브러리는 직접 사용할 수 없습니다. 특수 포맷팅이 필요한 경우 10 진수 포맷터를 제안하지만 값을 측정 한 다음 표준 라이브러리의 적절한 모드와 정밀도를 설정하여 수행 할 수도 있습니다.

0

이렇게하면?

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void printnum(double num_in) 
{ 
    char buff[32]; 
    char buff2[32]; 

    if (num_in >= 10000000000.0) 
    { 
     sprintf (buff, "%e", num_in); 
    } 
    else 
    { 
     char *pt; 
     unsigned long long tmp; 
     tmp = floor (num_in); 
     sprintf (buff, "%llu", tmp); 
     num_in -= tmp; 
     if(num_in < 1.0e-11) 
     { 
      printf("%s\n",buff); 
      return; 
     } 
     sprintf (buff2, "%10.9lf", num_in); 
     pt = memchr (buff2, '.', 32); 
     strcat (buff, pt); 
    } 
     printf("%s\n",buff); 
    } 

    int main(void) 
    { 
     double t = 100.0; 
     int i; 
     for(i=0;i<11;i++) 
     { 
     printf("%lf\t",t); 
     printnum(t); 
     t *= 12.3456; 
    } 
    return 0; 
} 
0

스트림이 작업을 수행 할 수 있다고 생각합니다.

#include <locale> 
#include <sstream> 

std::wostringstream out; 
out.imbue(std::locale::classic()); // Make sure a '.' is used as decimal point 
out.precision(9); // set fraction to 9 digits 

out << 1.2; 

const std::wstring str = out.str();