您好我想格式化浮点数,以便显示如下:
decimal.fraction
其中decimal =最多11位数和 分数=最多9位
并且如果没有分数部分它应该显示不是分数,并且小数部分表示中超过11位将是科学形式。
任何人都可以帮助我吗?
答案 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();