奇怪的是函数“printf”的输出精度

时间:2012-03-10 06:39:04

标签: c printf

    printf("%.2lf\n",odd);                        //(1)
    printf("%.2lf\n",37.975);                     //(2)
    printf("%.2lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.3lf\n",(odd*0.65 -1)*2);            //(4)

以下是输出:

30.75

37.98

37.97

37.975

为什么表达式(3)的输出不是37.98?

我使用g ++。

3 个答案:

答案 0 :(得分:3)

这可能是由于浮点舍入错误造成的。 (odd * 0.65 - 1) * 2的结果可能是37.97499999999999或接近(但小于)37.975的结果。按照通常的舍入规则,这会在输出中向下舍入到37.97

答案 1 :(得分:2)

由于odd设置为37.975会得到不同的结果,原因很可能是odd 比计算中的30.75略小于(你不是在你的问题中显示它未圆整)这使计算结果的数字略小于37.975。

答案 2 :(得分:1)

计算机(二进制)浮点不能精确表示十进制数,就像十进制浮点不能代表某些分数一样。例如1/9 = .11111111111 ....显示更多精度数字,你会看到发生了什么。

由于您没有提供odd的值,我选择的结果相同:

#include <stdio.h>

int main()
{
    double odd = 30.7499;
    printf("%.2lf\n",odd);                        //(1)
    printf("%.2lf\n",37.975);                     //(2)
    printf("%.2lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.3lf\n",(odd*0.65 -1)*2);            //(4)
    printf("%.20lf\n",odd);                        //(1)
    printf("%.20lf\n",37.975);                     //(2)
    printf("%.20lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.20lf\n",(odd*0.65 -1)*2);            //(4)
    return 0;
}

输出

30.75
37.98
37.97
37.975
30.74990000000000000000
37.97500000000000100000
37.97487000000000300000
37.97487000000000300000