鱼C论坛

 找回密码
 立即注册
查看: 2896|回复: 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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 00:05:29 | 显示全部楼层
好像浮点数计算都会掉精度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. int main()
  3. {
  4.         int total;
  5.         float sum=0;
  6.         printf("请输入学生人数\n");
  7.         scanf("%d",&total);
  8.         float mark[total];
  9.         printf("请输入每个学生的成绩\n");
  10.         for(int count=0;count<total;count++)
  11.         {
  12.                 scanf("%f",&mark[count]);
  13.                 sum=sum+mark[count];
  14.         }
  15.         printf("sum = %f\n",sum);
  16.         double result=(double)sum/total;
  17.         printf("平均成绩为 %.20lf 分!\n",result);
  18.         return 0;
  19. }
复制代码

就这个小代码,
  1. 请输入学生人数
  2. 5
  3. 请输入每个学生的成绩
  4. 150
  5. 149
  6. 148
  7. 147
  8. 145
  9. sum = 739.000000
  10. 平均成绩为 147.80000000000001000000 分!

  11. --------------------------------
  12. Process exited after 12.42 seconds with return value 0
  13. 请按任意键继续. . .
复制代码

他是会在小数点后有偏差的,好像说是跟计算机存储小数的方式有关,具体我也不清楚。(可能有错大佬勿喷
你改成double应该影响就不大,可以接受
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

我也不明白,可能与系统配置有关?我的linus虚拟系统配置都是默认的,而你运行的没问题,应该说明这与float还是double没太大关系吧
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

太强了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

浮点变量别用float用double啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

谢谢提醒
但我认为double应该也会在输出时有偏差吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 00:57:40 | 显示全部楼层
问题解决了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

会有偏差,但是能好很多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的3Q
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 18:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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