鱼C论坛

 找回密码
 立即注册
查看: 2112|回复: 13

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

[复制链接]
发表于 2022-7-31 23:19:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图显示,6000*120-6000*120*0.7=216000,而6000*120*(1-0.7)=216000.02(四舍五入)
最佳答案
2022-8-1 08:08:59
本帖最后由 tommyyu 于 2022-8-1 08:14 编辑
164342146 发表于 2022-8-1 01:07
我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与flo ...


我感觉是因为在计算中浮点数会掉精度
屏幕截图 2022-07-31 231604.png

代码.zip

788 Bytes, 下载次数: 6

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 00:05:29 | 显示全部楼层
好像浮点数计算都会掉精度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 00:29:16 | 显示全部楼层
我的一个代码也有相同的问题,
#include <stdio.h>

int main()
{
        int total;
        float sum=0;
        printf("请输入学生人数\n");
        scanf("%d",&total);
        float mark[total];
        printf("请输入每个学生的成绩\n");
        for(int count=0;count<total;count++)
        {
                scanf("%f",&mark[count]);
                sum=sum+mark[count];
        }
        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
请按任意键继续. . .
他是会在小数点后有偏差的,好像说是跟计算机存储小数的方式有关,具体我也不清楚。(可能有错大佬勿喷
你改成double应该影响就不大,可以接受
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 00:31:17 | 显示全部楼层
然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-1 01:07:36 From FishC Mobile | 显示全部楼层
额外减小 发表于 2022-8-1 00:31
然后至于你的“aa”的文件,我显示了小数40位都没掉精度,不知道为什么,求解惑

我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与float还是double没太大关系吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 08:08:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 tommyyu 于 2022-8-1 08:14 编辑
164342146 发表于 2022-8-1 01:07
我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与flo ...


我感觉是因为在计算中浮点数会掉精度
屏幕截图 2022-07-31 183802.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-1 11:48:47 | 显示全部楼层
tommyyu 发表于 2022-8-1 08:08
我感觉是因为在计算中浮点数会掉精度

太强了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:58:09 | 显示全部楼层
额外减小 发表于 2022-8-1 00:29
我的一个代码也有相同的问题,
就这个小代码,

浮点变量别用float用double啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-13 17:01:56 | 显示全部楼层
@164342146
@额外减小

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

使用道具 举报

发表于 2022-8-13 22:18:20 | 显示全部楼层
ExiaGN001 发表于 2022-8-13 17:01
@164342146
@额外减小

谢谢提醒
但我认为double应该也会在输出时有偏差吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 00:57:40 | 显示全部楼层
问题解决了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 10:18:38 | 显示全部楼层
额外减小 发表于 2022-8-13 22:18
谢谢提醒
但我认为double应该也会在输出时有偏差吧?

会有偏差,但是能好很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 20:26:16 | 显示全部楼层
ExiaGN001 发表于 2022-8-14 10:18
会有偏差,但是能好很多

是的3Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 19:13:14 | 显示全部楼层
对float经行多次乘除运算结果的确会有误差
要不这么写?
6000*120*(double)0.3
(1-0.7)中的0.7转2进制是无限小数,况且他还是可怜的float,又来个1-0.7,精度没有误差才怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-21 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表