您好我想格式化浮點數使得它將被顯示如下:格式浮點數
decimal.fraction
其中小數=最大11個位數和 分數=最大9個位數
如果沒有小數部分,它應該顯示不是小數,並且小數部分中超過11位的數字將以科學形式表示。
任何人都可以幫助我嗎?
您好我想格式化浮點數使得它將被顯示如下:格式浮點數
decimal.fraction
其中小數=最大11個位數和 分數=最大9個位數
如果沒有小數部分,它應該顯示不是小數,並且小數部分中超過11位的數字將以科學形式表示。
任何人都可以幫助我嗎?
我不認爲有這樣的內部格式。你需要自己格式化(未測試):
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);
}
}
標準庫不能直接爲你做。如果您需要專門的格式化,我會建議您自己的小數格式化程序,但您也可以通過測量值然後爲標準庫設置適當的模式和精度來完成。
喜歡這個?
#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;
}
我認爲流可以完成這項工作。
#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();