不同形式的printf

printf in different forms

我的数据类型为 double,我想 printf 以下形式的双精度值:

有什么办法可以尽快完成吗?还是我需要使用 if 语句或类似的东西?

double x = 2;
printf("%d", x);
double x = 2.3;
printf("%.1f", x);

这只是一个插图。 我想根据得到的值 printf 一个整数或一个双精度值。

考虑 i 是一个 int 变量。在像 i==x 这样的检查之前,将 x 的值赋给 i。它将被分配 x 的截断值。然后

if(i==x) printf("%d",i);

i==x 仅当 x 没有任何片段时才为真。

else printf("%.1f",x);

快速而肮脏 打印具有最少小数位数的 double 而无需额外循环的方法是使用 %g 转换说明符。

#include <stdio.h>

void print_num(double x) {
     printf("%g", x);
}

非常小和非常大的值可能需要更明确的方法来避免指数形式:

#include <stdio.h>

void print_num(double x) {
    char buf[500];
    int n = snprintf(buf, sizeof buf, "%.15f", x);
    while (n > 0 && buf[n - 1] == '0') {
        buf[--n] = '[=11=]';
    }
    if (n > 0 && buf[n - 1] == '.') {
        buf[--n] = '[=11=]';
    }
    printf("%s", buf);
}

如果 OP想要在.后保留一位小数,当值不是整数时:

使用".*"trunc()来控制精度位数。

trunc() returns double 小数部分被截断。

double f = 2.3;
printf("%.*f\n", f != trunc(f), f);  // 1 digit
f = 2.0;
printf("%.*f\n", f != trunc(f), f);   // 0 digits, no .

输出

2.3
2