格式化浮点数

4

嗨,我想格式化浮点数,使其显示如下:

十进制.小数

其中,十进制=最多11位数字,小数=最多9位数字

如果没有小数部分,则应显示“无小数”,对于十进制部分超过11位的表示将采用科学计数法。

有人可以帮我吗?

4个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接