格式化浮点数

时间:2010-03-04 06:53:51

标签: c++ c

您好我想格式化浮点数,以便显示如下:

decimal.fraction

其中decimal =最多11位数和 分数=最多9位

并且如果没有分数部分它应该显示不是分数,并且小数部分表示中超过11位将是科学形式。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分: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 :(得分:1)

标准库无法直接为您执行此操作。如果您需要专门的格式化,我建议使用您自己的十进制格式化程序,但您也可以通过测量值然后为标准库设置正确的模式和精度来完成。

答案 2 :(得分: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;
}

答案 3 :(得分: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();