[英]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.