乘法分配率前后结果相差了约0.02,麻烦大家看看哪里出了问题
如图显示,6000*120-6000*120*0.7=216000,而6000*120*(1-0.7)=216000.02(四舍五入) 好像浮点数计算都会掉精度 我的一个代码也有相同的问题,#include <stdio.h>int main()
{
int total;
float sum=0;
printf("请输入学生人数\n");
scanf("%d",&total);
float mark;
printf("请输入每个学生的成绩\n");
for(int count=0;count<total;count++)
{
scanf("%f",&mark);
sum=sum+mark;
}
printf("sum = %f\n",sum);
double result=(double)sum/total;
printf("平均成绩为 %.20lf 分!\n",result);
return 0;
}
就这个小代码,
请输入学生人数
5
请输入每个学生的成绩
150
149
148
147
145
sum = 739.000000
平均成绩为 147.80000000000001000000 分!
--------------------------------
Process exited after 12.42 seconds with return value 0
请按任意键继续. . .
他是会在小数点后有偏差的,好像说是跟计算机存储小数的方式有关,具体我也不清楚。(可能有错大佬勿喷{:10_266:})
你改成double应该影响就不大,可以接受{:10_256:} 然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑 额外减小 发表于 2022-8-1 00:31
然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑
我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与float还是double没太大关系吧 本帖最后由 tommyyu 于 2022-8-1 08:14 编辑
164342146 发表于 2022-8-1 01:07
我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与flo ...
我感觉是因为在计算中浮点数会掉精度 tommyyu 发表于 2022-8-1 08:08
我感觉是因为在计算中浮点数会掉精度
{:10_298:}太强了。 额外减小 发表于 2022-8-1 00:29
我的一个代码也有相同的问题,
就这个小代码,
浮点变量别用float用double啊! @164342146
@额外减小
请在编写程序中尽量使用double 甚至long double类型而不是float类型。
float类型的有效数字有限(7位),在计算一些精度较高的数值时可能会出现精度损失从而导致错误/不精确的结果。
相比之下,double的15位有效数字可能会解决更多问题。
当然,printf在面对保留位数的浮点数的输出机制时,其行为可能会随编译器不同而产生差异,这也是导致意料之外结果的原因。 ExiaGN001 发表于 2022-8-13 17:01
@164342146
@额外减小
谢谢提醒
但我认为double应该也会在输出时有偏差吧? 问题解决了吗? 额外减小 发表于 2022-8-13 22:18
谢谢提醒
但我认为double应该也会在输出时有偏差吧?
会有偏差,但是能好很多 ExiaGN001 发表于 2022-8-14 10:18
会有偏差,但是能好很多
是的{:10_256:}3Q 对float经行多次乘除运算结果的确会有误差
要不这么写?
6000*120*(double)0.3
(1-0.7)中的0.7转2进制是无限小数,况且他还是可怜的float,又来个1-0.7,精度没有误差才怪
页:
[1]