c语言中分数值为5时如何改变前一个分数值
How can i change the previous fraction value when the fraction value is 5. in c language
我试图编写一个代码,如果小数值是 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%
根据您在问题中的措辞,您可能忘记了代码 %0.2
中的“0”。
你的数学,用 32 位 float
s,得出 e
的最终值 0.004999...
,而不是 "logical" 0.005
你期望(并期望四舍五入到 0.01
)。那是 just how it is with floating point math。将其四舍五入到小数点后两位准确地将结果描述为 0.00
;它小于 0.005
,因此四舍五入为 0.00
,而不是 0.01
。
使用更精确的类型 (double
) 可能 有帮助(在我的机器上确实如此 [在将 scanf
更改为使用 %lf
],但许多编译器,尤其是具有更高优化的编译器和某些体系结构,违反了 IEEE-754 规范,并且可能不同意),但从根本上说,浮点数学会引入相对于精确逻辑算术的错误,因此您应该使用不同的方法如果你不能容忍小错误,例如基于定点 int
的数学,或 libmpdec
或类似的全十进制(基数 10)浮点数学。
请注意,根据您选择的操作,您可能需要注意舍入模式; C99 将值从零四舍五入,但还有其他舍入模式(四舍五入是一种常见的模式,因为没有在舍入中引入偏差)四舍五入到小数点后两位时会产生 0.00
,即使你确实准确地生产了0.005
。
我试图编写一个代码,如果小数值是 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%
根据您在问题中的措辞,您可能忘记了代码 %0.2
中的“0”。
你的数学,用 32 位 float
s,得出 e
的最终值 0.004999...
,而不是 "logical" 0.005
你期望(并期望四舍五入到 0.01
)。那是 just how it is with floating point math。将其四舍五入到小数点后两位准确地将结果描述为 0.00
;它小于 0.005
,因此四舍五入为 0.00
,而不是 0.01
。
使用更精确的类型 (double
) 可能 有帮助(在我的机器上确实如此 [在将 scanf
更改为使用 %lf
],但许多编译器,尤其是具有更高优化的编译器和某些体系结构,违反了 IEEE-754 规范,并且可能不同意),但从根本上说,浮点数学会引入相对于精确逻辑算术的错误,因此您应该使用不同的方法如果你不能容忍小错误,例如基于定点 int
的数学,或 libmpdec
或类似的全十进制(基数 10)浮点数学。
请注意,根据您选择的操作,您可能需要注意舍入模式; C99 将值从零四舍五入,但还有其他舍入模式(四舍五入是一种常见的模式,因为没有在舍入中引入偏差)四舍五入到小数点后两位时会产生 0.00
,即使你确实准确地生产了0.005
。