long和double是long与double的包装类,用于安全转换、null处理及集合存储,但需警惕溢出、精度丢失和空指针;超范围整数或高精度需求应改用bigdecimal。

Java中Long和Double是基本类型long与double的包装类,它们本身不“处理大数值”,但能安全地在字符串、基本类型、对象之间转换,尤其在涉及精度、空值、集合存储等场景时比基本类型更灵活。关键不是“处理大数值”,而是正确应对溢出、精度丢失、null安全等常见陷阱。
理解Long与Double的取值范围和精度限制
Long表示64位有符号整数,范围是-2⁶³ ~ 2⁶³−1(约±9.2×10¹⁸),超出会溢出;Double是64位浮点数,能表示更大数量级(约±1.8×10³⁰⁸),但仅保证约15~17位十进制有效数字,整数部分超过2⁵³(约9×10¹⁵)后无法精确表示每个整数。
- 例如:Long.parseLong("9223372036854775807")合法,但Long.parseLong("9223372036854775808")抛NumberFormatException
- 而Double.valueOf("9007199254740993")返回的值其实是9007199254740992.0——最后一位已丢失
安全地从字符串转为Long或Double
避免直接用parseXXX()方法,尤其当输入不可控(如用户输入、API响应)时。优先使用valueOf()并配合try-catch,或先校验再转换。
- 推荐方式:用Long.valueOf(str)或Double.valueOf(str),它们对null抛NullPointerException,对非法格式抛NumberFormatException,便于统一捕获
- 若需null容忍,可先判空:str != null && !str.trim().isEmpty(),再调用valueOf
- 如需默认值,可封装工具方法:Long safeParseLong(String s, Long defaultValue) { try { return Long.valueOf(s); } catch (Exception e) { return defaultValue; } }
在数值运算中避免隐式装箱/拆箱引发的问题
包装类参与算术运算时会自动拆箱,但若对象为null,将触发NullPointerException——这是新手最易踩的坑。
- 错误写法:Long a = null; long sum = a + 10; → 运行时报空指针
- 安全做法:先判空再拆箱,或使用Optional:Optional.ofNullable(a).map(v -> v + 10).orElse(0L)
- 集合中存的是包装类(如List
),遍历时别直接用于计算,先确认非null
何时该用Long/Double,何时该换BigDecimal?
当业务要求精确整数运算(如金额、ID、计数)且可能超Long范围,或需要高精度小数运算(如金融计算、科学测量),就必须放弃Double,改用BigDecimal。
- Long适合:订单号、时间戳、数据库主键(只要在范围内)、统计计数
- Double适合:传感器读数、坐标、近似比例、性能指标(允许小幅误差)
- BigDecimal适合:钱、利率、税率、任何不能容忍舍入误差的场景;注意它不可变,每次运算都返回新对象










