164342146 发表于 2022-7-31 23:19:43

乘法分配率前后结果相差了约0.02,麻烦大家看看哪里出了问题

如图显示,6000*120-6000*120*0.7=216000,而6000*120*(1-0.7)=216000.02(四舍五入)

额外减小 发表于 2022-8-1 00:05:29

好像浮点数计算都会掉精度

额外减小 发表于 2022-8-1 00:29:16

我的一个代码也有相同的问题,#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:}

额外减小 发表于 2022-8-1 00:31:17

然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑

164342146 发表于 2022-8-1 01:07:36

额外减小 发表于 2022-8-1 00:31
然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑

我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与float还是double没太大关系吧

tommyyu 发表于 2022-8-1 08:08:59

本帖最后由 tommyyu 于 2022-8-1 08:14 编辑

164342146 发表于 2022-8-1 01:07
我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与flo ...

我感觉是因为在计算中浮点数会掉精度

额外减小 发表于 2022-8-1 11:48:47

tommyyu 发表于 2022-8-1 08:08
我感觉是因为在计算中浮点数会掉精度

{:10_298:}太强了。

ExiaGN001 发表于 2022-8-13 16:58:09

额外减小 发表于 2022-8-1 00:29
我的一个代码也有相同的问题,
就这个小代码,



浮点变量别用float用double啊!

ExiaGN001 发表于 2022-8-13 17:01:56

@164342146
@额外减小

请在编写程序中尽量使用double 甚至long double类型而不是float类型。
float类型的有效数字有限(7位),在计算一些精度较高的数值时可能会出现精度损失从而导致错误/不精确的结果。
相比之下,double的15位有效数字可能会解决更多问题。
当然,printf在面对保留位数的浮点数的输出机制时,其行为可能会随编译器不同而产生差异,这也是导致意料之外结果的原因。

额外减小 发表于 2022-8-13 22:18:20

ExiaGN001 发表于 2022-8-13 17:01
@164342146
@额外减小



谢谢提醒
但我认为double应该也会在输出时有偏差吧?

liuzhengyuan 发表于 2022-8-14 00:57:40

问题解决了吗?

ExiaGN001 发表于 2022-8-14 10:18:38

额外减小 发表于 2022-8-13 22:18
谢谢提醒
但我认为double应该也会在输出时有偏差吧?

会有偏差,但是能好很多

额外减小 发表于 2022-8-14 20:26:16

ExiaGN001 发表于 2022-8-14 10:18
会有偏差,但是能好很多

是的{:10_256:}3Q

zhangjinxuan 发表于 2022-8-15 19:13:14

对float经行多次乘除运算结果的确会有误差
要不这么写?
6000*120*(double)0.3
(1-0.7)中的0.7转2进制是无限小数,况且他还是可怜的float,又来个1-0.7,精度没有误差才怪
页: [1]
查看完整版本: 乘法分配率前后结果相差了约0.02,麻烦大家看看哪里出了问题