Java中整型存精确值、浮点型存近似值:整型用二进制补码,浮点型按IEEE 754分符号位、指数位、尾数位;选错类型会导致精度错误或比较失效。

Java 中整数和浮点类型本质不同:整型存精确值,浮点型存近似值;前者按二进制补码直接表示整数,后者按 IEEE 754 标准拆分为符号位、指数位、尾数位三部分存储。选错类型不仅浪费内存,还可能引发精度错误或比较失效。
整型存储原理与关键细节
整型(byte/short/int/long)全部采用二进制补码表示,无小数部分,每个值都能被精确还原。例如 int 占 4 字节(32 位),最高位为符号位,其余 31 位表示数值大小,范围固定为 -2³¹ 到 2³¹−1。
- 字面量默认是 int 类型;赋值超范围需显式加 L(如 10000000000L)才被识别为 long
- byte 和 short 虽小,但参与运算时会自动提升为 int,实际性能差异常被高估
- 溢出不报错,而是“绕回”——比如 Integer.MAX_VALUE + 1 得到 Integer.MIN_VALUE
浮点型存储原理与精度陷阱
float 和 double 遵循 IEEE 754 标准:以“符号+指数+尾数”方式存储,本质是科学计数法的二进制实现。这意味着大多数十进制小数(如 0.1)无法被精确表示,只能无限趋近。
- float 占 4 字节,有效精度约 6–7 位;double 占 8 字节,有效精度约 15–16 位
- float 字面量必须加 F/f(如 3.14F),否则 Java 默认按 double 处理
- 永远不要用 == 比较浮点数;应使用 Math.abs(a - b) < epsilon 判断是否“足够接近”
典型应用场景选择指南
类型选择不是看“有没有小数点”,而是看数据本质和计算要求:
立即学习“Java免费学习笔记(深入)”;
- 用 int:年龄、数组下标、循环变量、HTTP 状态码等离散整数
- 用 long:毫秒时间戳(System.currentTimeMillis())、数据库主键(尤其分布式ID)、文件大小(字节数)
- 用 double:绝大多数带小数的业务场景——价格(注意金融场景仍建议 BigDecimal)、物理量(温度、重量)、坐标、统计平均值
- 慎用 float:仅限内存极度敏感且精度容忍度高的场景,如移动端图形渲染、传感器原始采样值
常见误用与规避建议
很多 bug 源于混淆存储语义:
- 把金额用 float/double 存储 → 改用 BigDecimal 或以“分”为单位用 long 存储整数
- 用 int 存年份(如 2025)没问题,但用 int 存毫秒时间戳会溢出 → 必须用 long
- 从数据库读取 numeric 类型字段,JDBC 默认映射为 double → 若需精确,应显式调用 getBigDecimal()
- JSON 序列化中数字默认转 double → 若后端是 long ID,前端 JavaScript 可能丢失精度(超过 2⁵³),建议传字符串


















