C程序使用函数将浮点数舍入到小数点后的3位数?

时间:2016-10-18 15:52:37

标签: c math rounding

一个例子是如果输入是3456.7856,那么输出应该是3456.786。

非常感谢你,祝福一天!

1 个答案:

答案 0 :(得分:2)

名为printf的标准库函数可以进行舍入:

#include <stdio.h>

int
main(void) {
    double dbl = 3456.7856;
    printf("%.3f", dbl);
}

如果您想在某些计算中使用舍入值:

#include <stdio.h>
#include <float.h>
#include <math.h>

double
round_to_3(double dbl);

int
main(void) {
    double dbl = 3456.7856, dummy; // dummy will hold the integral part of dbl
                                   // , which we won't use

    if(modf(dbl, &dummy)) {
        dbl = round_to_3(dbl);
    }

    // Do some computation

    printf("%.3f", dbl);
}

double
round_to_3(double dbl) {
    char buffer[1 + 1 + DBL_MAX_10_EXP + 1 + 3 + 1]; 
    // Making sure the buffer is big enough:
    //
    // 1 for the potential sign
    // plus 1 for the leading digit
    // plus DBL_MAX_10_EXP for the potential digits before the decimal mark
    // plus 1 for the decimal mark
    // plus 3 for the digits after the decimal mark
    // plus 1 for the ending '\0'

    sprintf(buffer, "%.3f", dbl);
    sscanf(buffer, "%lf", &dbl);

    return dbl;
}

这个解决方案看起来很奇怪,但它不会导致溢出,并提供最大的准确性。

modf(dbl, &intpart) == 0时你不需要进行舍入,因为与base ^ exponent相比,重要性通常非常小,在这种情况下是10 ^ DBL_MAX_10_EXP。({{1}除了按位异或(XOR)

之外的意思是取幂