当前位置: 首页 > news >正文

为什么 printf(“%d“, 5/2) 输出 2 不是 2.5?C语言整数除法陷阱

为什么 printf(“%d”, 5/2) 输出 2 不是 2.5?C语言的整数除法陷阱

你有没有遇到过这种情况?

#include<stdio.h>intmain(){printf("%d\n",5/2);// 输出 2,不是 2.5!printf("%d\n",10/3);// 输出 3,不是 3.333...printf("%d\n",1/2);// 输出 0!return0;}

很多人刚开始学 C 语言,看到1 / 2 = 0整个人都懵了——哪怕是小学数学也知道一除以二等于零点五啊。

但这个结果不是 bug,是 C 语言设计者有意为之的「整数除法」。今天 3 分钟彻底搞懂。


一句话结论:整数 / 整数 = 整数,小数部分直接被丢弃

C 语言里,两个整数相除,结果一定是整数。计算过程是:

5 / 2 = 2.5 → 去掉小数 → 2 10 / 3 = 3.333... → 去掉小数 → 3 1 / 2 = 0.5 → 去掉小数 → 0

不是四舍五入,是直接截断(truncation),一刀切掉小数部分。


画个图就清楚了

5 / 2 的计算过程: ┌───┬───┬───┬───┬───┐ │ 1 │ 2 │ 3 │ 4 │ 5 │ 5 个苹果 └───┴───┴───┴───┴───┘ 每 2 个一组: ┌───┬───┐ ┌───┬───┐ ┌───┐ │ 1 │ 2 │ │ 3 │ 4 │ │ 5 │ ← 剩下的 1 个不够一组 └───┴───┘ └───┴───┘ └───┘ 第1组 第2组 被丢弃 结果 = 2(组数),不是 2.5

那我想得到 2.5 怎么办?

// 方法一:把其中一个操作数变成浮点数printf("%f\n",5.0/2);// 2.500000printf("%f\n",5/2.0);// 2.500000// 方法二:强制类型转换printf("%f\n",(double)5/2);// 2.500000// 方法三:两个都转printf("%f\n",5.0/2.0);// 2.500000

只要除法表达式里有一个是浮点数,C 语言就会自动做浮点除法。


这个坑不止在输出时

doubleresult=5/2;// result = 2.0,不是 2.5!printf("%f\n",result);// 输出 2.000000

为什么?因为5 / 2先算(整数除法得 2),然后才把 2 转成 double 赋值。转换发生在除法之后,太迟了。

正确写法:

doubleresult=5.0/2;// result = 2.5// 或者doubleresult=(double)5/2;// result = 2.5

一张表记住

表达式结果原因
5 / 22整数除法,截断
5.0 / 22.5浮点除法
5 / 2.02.5浮点除法
5.0 / 2.02.5浮点除法
1 / 20最容易踩的坑
(double)5 / 22.5显式类型转换
double x = 5/22.0先整除再赋值,来不及

记住一句话

C 语言里两个整数相除,小数部分会被直接丢弃,不是四舍五入。想要小数结果,至少让一个操作数变成浮点数。

理解了这条规则,你也就明白了为什么1 / 2等于 0——不是数学错了,是类型决定了计算方式。

你还被哪些反直觉的 C 语言结果坑过?评论区聊聊。

#c语言 #算法 #数据结构

http://www.jsqmd.com/news/1139096/

相关文章:

  • Gemma-2B/4B本地部署实战:从树莓派到Mac的全栈调优指南
  • 同质化质控工具无法支撑集团实验室管控,IACheck AI 报告文档审核统一全机构审核标尺
  • [特殊字符] 京东开放平台(JOS)免费额度与收费标准(2026版):基础/联盟/商家接口对照表(附Python源码)
  • Linux 命令历史彻底删除 完整恢复实操指南
  • Dice Loss 负值排查实战:语义分割中 40 类 GT 编码错误的 3 步修复
  • 风云天下重燃(1折免费版)首曝
  • ROP-RAS3:长时域POMDP在线规划的实时突破
  • 构建自定义加密库:从算法封装到密钥管理的工程实践
  • STM32F103C8T6 核心板 PCB 设计:新手避坑 5 要点与嘉立创免费打样实战
  • 兰州软件开发服务商如何选择?五个维度对比分析
  • 电力能源企业设备巡检数据分析用哪款Agent?主流智能体平台技术测评与选型指南
  • DLO-Lab:面向可变形线状物体的可微分仿真基准
  • 跨境卖家多平台二次验证统一管理
  • 水面无人艇无GPS协同围捕控制技术
  • nVisual:全局资源可视 + 闲置预警,新购资源下降20%
  • 跨越平台壁垒:BotW存档管理器让你的海拉鲁冒险永不中断
  • FastAPI零基础教程(九)- 测试与部署,1天完成生产落地
  • 从BIO到Netty:一步步看懂Java网络编程的迭代逻辑
  • Allegro PCB 铺铜与DRC检查:3类禁铺区设置与5项关键间距规则详解
  • 深度拆解机器人视觉FOV:水平 / 垂直 / 对角视场的核心区别
  • Day 1: Python简介与安装配置
  • nVisual:机柜/端口/纤芯占用一目了然,重复采购率下降30%
  • 国产贴片机亦唐:从技术创新到市场布局的全方位探索
  • Linux 彻底清空历史命令 恢复历史命令(完整版、重启永久生效)
  • 汽车CAN总线开发实战:从CAN盒入门到AUTOSAR配置,手把手带你走完完整流程
  • PREEMPT_RT 技术实现:RCU
  • 旋转机械故障诊断数据集的系统设计与工程实践深度解析
  • 深入浅出微信消息回调:基于 Webhook 的高效事件驱动架构设计
  • http://27.156.118.74:18800/web/html/index.html?module=tflj
  • 2026年标签打印软件排行榜:5个核心选择技巧必看