printf double,最多n位小数但不是更多

时间:2016-11-08 06:44:00

标签: c++ c printf

我希望将双倍输出跟踪到小数点后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的幂

Live example

3 个答案:

答案 0 :(得分:2)

如果已知绝对值介于0.006999.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)

modfpow的帮助下:

#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并给你正确的答案。