我希望将双倍输出跟踪到小数点后2位。请考虑以下示例:
#include <stdio.h>
int main() {
printf( "%.2f\n", 2. );
printf( "%.2f\n", 2.5 );
printf( "%.2f\n", 2.25 );
printf( "%.2f\n", 2.125 );
}
输出
2.00
2.50
2.25
2.12
有没有办法打印小于2位小数的值,以防需要更少?我的意思是所需的输出是
2
2.5
2.25
2.12
允许使用iomanip的答案。我专注于C ++,而不是C,但这个例子只是c-only。
我知道,这通常是不可能的,因为双值不精确,但在我的例子中,它们是因为所有小数部分都是2的幂
答案 0 :(得分:2)
如果已知绝对值介于0.006
和999.995
之间,则可以使用格式%.3g
:
#include <stdio.h>
int main() {
printf( "%.3g\n", 2. );
printf( "%.3g\n", 2.5 );
printf( "%.3g\n", 2.25 );
printf( "%.3g\n", 2.125 );
}
输出
2
2.5
2.25
2.12
但是对于一般情况,似乎需要修剪由snprintf()
转换的字符串:
void print_double_with_at_most_2_decimal_figures(double x) {
char buf[400];
int i = snprintf(buf, sizeof buf, "%.2f", x);
while (i > 0 && buf[i - 1] == '0')
buf[--i] = '\0';
if (i > 0 && buf[i - 1] == '.')
buf[--i] = '\0';
fputs(buf, stdout);
}
答案 1 :(得分:0)
在modf
和pow
的帮助下:
#include <stdio.h>
#include <math.h>
static int dprec(double num, int digs)
{
if (digs <= 0) return 0;
double integral;
// fractional part * (10 ^ digs)
long mul = (long)(modf(num, &integral) * pow(10, digs));
while (digs) {
if (mul % 10 != 0) {
break;
}
mul /= 10;
digs--;
}
return digs;
}
int main(void)
{
double nums[] = {2.00, 2.50, 2.25, 2.125};
for (size_t i = 0; i < sizeof(nums) / sizeof(nums[0]); i++) {
int prec = dprec(nums[i], 2);
printf("%.*f\n", prec, nums[i]);
}
return 0;
}
输出:
2
2.5
2.25
2.12
答案 2 :(得分:-3)
执行此操作的一种方法是获取2.00
的值,然后将其分配给变量。这应该照顾额外的0并给你正确的答案。