我试图编写一个代码,如果小数位值为0.005,则在十进制值之后,它将把值打印为0.01。我尝试使用%0.02f,但此方法无效。我的完整代码如下和输入值。
#include<stdio.h>
int main()
{
float a,b,c=0,d=0,e=0;
while(1)
{
a=0;b=0;c=0,d=0,e=0;
scanf("%f%f",&a,&b);
c=b-a;
d=c*100.0;
e=d/a;
//printf("%0.2f\n%0.2f\n%0.2f\n",c,d,e);
printf("%0.2f%%\n",e);
}
return 0;
}
输入 999.95 1000.00
预期输出= 0.01%
我的输出= 0.00%
数学的32位float
s的最终值为,e
而0.004999...
不是0.005
您期望的(并舍入为0.01
)的“逻辑”值。这只是它是如何与浮点运算。四舍五入到小数点后两位精确地描述结果为0.00
; 它小于0.005
,因此四舍五入而0.00
不是0.01
。
使用更精确的类型(double
)可能会有所帮助(在[更改scanf
为使用后%lf
]在我的机器上确实有用,但是许多编译器,尤其是具有更高优化的编译器和某些体系结构,都违反了IEEE-754规范,并且可能会不同意),但从根本上讲,浮点数学运算会引入相对于精确逻辑算术的误差,因此,如果您不能容忍甚至很小的误差,则应使用其他方法,例如,int
基于定点的数学运算libmpdec
或诸如此类的全十进制(以10为底)浮点点数学。
请注意,根据您选择的操作,可能需要注意舍入模式。C99舍中途值远离零,但也有其他舍入模式(圆形半甚至是常见的一种,由于没有引入的舍入偏置),这将产生0.00
四舍五入至小数点后两位的时候,即使你没有产品0.005
恰恰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句