强制类型转换时遇到的数据错误

NonArrendertiMai 2020-11-05 07:08:48

前几天做数据处理的时候发现出现一部分0值,排查后发现用(int)取整后部分数值有误,遂做了以下测试

#include <stdio.h>

int main()
{
int i,res4,res5;
float td1,fd1,res1,res2,res3;

td1=1.0/10;
fd1=1.0/1024;
i=274645;

res1=i*td1/fd1;
res2=(int)(res1)+1;
res3=(int)(res1+1);
res4=(int)(res1)+1;
res5=(int)(res1+1);

printf("%f %f %f %d %d\n",res1,res2,res3,res4,res5);
return 0;
}

输出结果 28123648.000000 28123648.000000 28123648.000000 28123649 28123648

这就非常的奇怪了,其中的多个+1在数据类型转换之下就像失效了一样,不太明白是为什么。

编辑器VS Code,编译器GCC 8.1.0
...全文
222 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2020-11-06
  • 打赏
  • 举报
回复
Minikinfish 2020-11-06
  • 打赏
  • 举报
回复
float值有效位数6位,前6位保证有效,之后不保证。 计算机使用32位,存储float类型有关,IEEE754标准 可以使用64位的double声明,double可以保证15位有效
Minikinfish 2020-11-06
  • 打赏
  • 举报
回复
float值有效位数6位,前6位保证有效,只有不保证。 计算机使用32位,存储float类型有关, 可以使用64位的double声明,double可以保证15位有效
赵4老师 2020-11-06
  • 打赏
  • 举报
回复
float有效数字只有6位 请换double

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧