不同形式的printf
printf in different forms
我的数据类型为 double
,我想 printf
以下形式的双精度值:
- 如果
double x=2
或 x=2.0
将 2
打印到屏幕,这意味着如果我得到一个整数,我将打印一个整数。
- 如果
double x=2.3
或 x=2.30
或任何其他非整数,我将 2.3
打印到屏幕上。
有什么办法可以尽快完成吗?还是我需要使用 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
我的数据类型为 double
,我想 printf
以下形式的双精度值:
- 如果
double x=2
或x=2.0
将2
打印到屏幕,这意味着如果我得到一个整数,我将打印一个整数。 - 如果
double x=2.3
或x=2.30
或任何其他非整数,我将2.3
打印到屏幕上。
有什么办法可以尽快完成吗?还是我需要使用 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