避免java基本类型转换精度损失,需依语义选类型:整数运算优先long,浮点用double;金额等精度敏感场景用bigdecimal(valueof或字符串构造);小数转整用math.round;缩容转换须校验范围。

避免Java基本类型转换的精度损失,核心是理解“宽化转换不等于无损”,并根据数据语义选择合适类型与转换方式。不是所有转换都该发生,也不是所有强转都该用(int)x这种粗暴写法。
优先用足够宽的类型承载原始数据
整数运算尽量统一用 long,而非 int:时间戳、ID、计数器等场景中,int 容易溢出(如 2147483647 + 1 = -2147483648),而 long 范围(±9.2×10¹⁸)更安全;浮点计算优先用 double,float 仅约 7 位有效数字,double 约 15–17 位,对大多数业务已够用。
精度敏感场景绕开基本类型
涉及金额、利率、科学计算等不能容忍误差的业务,直接使用 BigDecimal,不走 double 或 float 中转:
- 创建时用 BigDecimal.valueOf(doubleValue),而非 new BigDecimal(doubleValue)——后者会继承 double 的二进制误差
- 字符串输入(如用户提交的 "19.99")应直接 new BigDecimal("19.99"),保留十进制语义
- 四舍五入用 setScale(2, RoundingMode.HALF_UP),不依赖 Math.round() 或 (int) 强转
小数转整数必须四舍五入,而非截断
(int)3.9 得 3,(int)-3.9 得 -3,这是向零截断,不是数学取整。正确做法:
- 正负数都合理:int i = (int) Math.round(d); 注意 Math.round(double) 返回 long,需显式转 int
- 若 d 是 float,用 Math.round(f) → int;若 d 是 double,用 Math.round(d) → long,再判断是否在 int 范围内
大整型转小整型前务必校验范围
long → int、int → byte 这类缩容转换默认静默截断,极易埋雷:
- 用 JDK 自带的 Math.toIntExact(longValue),超范围直接抛 ArithmeticException,让问题暴露在测试阶段
- 若需饱和处理(溢出时取 Integer.MAX_VALUE/MIN_VALUE),可用 Guava 的 Ints.saturatedCast()
- 自己校验示例:if (value >= Integer.MIN_VALUE && value
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











