2010-03-04 118 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

標準庫不能直接爲你做。如果您需要專門的格式化,我會建議您自己的小數格​​式化程序,但您也可以通過測量值然後爲標準庫設置適當的模式和精度來完成。

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();