繁体   English   中英

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

[英]strange about the output precision of the function “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

为什么expression(3)的输出不是37.98?

我使用g ++。

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

由于我得到的其他结果的odd设置为37.975,因此很可能是因为在您的计算中odd 略小于 30.75(您在问题中没有显示未四舍五入),这使得计算结果中的数字略有变化小于37.975。

计算机(二进制)浮点不能精确表示十进制数字,就像十进制浮点不能表示某些分数一样。 例如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM