int无法存储小数是因为其二进制表示无小数点、指数或尾数字段,赋值时小数部分被截断而非四舍五入;需用float或double按ieee 754标准近似表示小数,语义上int适用于离散量,double适用于连续量。

因为 int 类型在内存中只分配了存储整数的空间,没有设计存放小数点和小数部分的位。
int 的二进制表示不包含小数点信息
一个 int(比如 32 位)用全部 32 个比特表示一个有符号整数,最高位是符号位,其余 31 位表示绝对值大小。它没有“小数点位置”的字段,也没有指数、尾数等浮点数结构。所以像 3.14 这样的值根本无法被编码进 int 的布局里。
常见错误现象:int x = 3.14; 编译通过,但运行时 x 实际是 3 —— 小数部分被无声截断,不是四舍五入。
- 这种截断发生在赋值时,不是运行时报错,容易漏检
- 如果源是浮点表达式(如
7.0 / 2.0),再赋给int,同样只取整数部分 - 用
static_cast<int>(3.99)</int>也一样:结果是3,不是4
想存小数,必须换类型
要保留小数,得用浮点类型:float 或 double。它们按 IEEE 754 标准编码,包含符号位、指数位和尾数位,能近似表示小数值(注意:是近似,不是精确,比如 0.1 + 0.2 != 0.3)。
-
float通常 32 位,有效数字约 7 位;double通常 64 位,有效数字约 15–16 位 - 除非内存极度受限(如某些嵌入式场景),否则优先用
double,精度更可靠 - 别试图“挤”小数进
int:有人用int x = 314;再除以 100 来模拟两位小数,这会引入溢出、除零、缩放逻辑耦合等新问题
误用 int 存小数的典型后果
不只是“显示不对”,它会直接破坏计算逻辑:
- 平均值计算:
int sum = 7, count = 3; int avg = sum / count;→avg == 2,而真实均值是2.333... - 比例/缩放:
int scale = 150 / 100;永远得1,哪怕你本意是放大 1.5 倍 - 坐标或时间戳处理:毫秒转秒若用
int ms = 1500; int s = ms / 1000;,丢掉的 500ms 可能导致动画跳帧或定时偏差
最常被忽略的是:类型选择不是“能不能编译”,而是“语义是否匹配”。int 表达的是离散计数或索引,double 才承载连续量纲——这个边界一旦模糊,后续所有计算都在错误前提下展开。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











