温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Double双精度有何坑点

发布时间:2026-09-15 03:05:13 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 Java 中使用 double(及 Double)时,有不少常见“坑点”,很多都源于浮点数的二进制表示本质。下面按「原理 → 现象 → 示例 → 建议」来说明。


1. 精度丢失(最经典)

原因

doubleIEEE 754 二进制浮点数,很多十进制小数无法精确表示。

现象

System.out.println(0.1 + 0.2);
// 输出:0.30000000000000004

坑点

  • 不能用于金额、利率、精确计算
  • 比较相等会失败
System.out.println(0.1 + 0.2 == 0.3); // false

建议

  • 金额用 BigDecimal
  • 比较用误差范围:
Math.abs(a - b) < 1e-9

2. Double 比较的陷阱

错误写法

Double a = 0.1;
Double b = 0.1;
System.out.println(a == b); // 可能 false

原因

  • Double 是对象,== 比较的是引用
  • 即使值相同,也可能不是同一对象

正确写法

a.equals(b);
// 或
Double.compare(a, b) == 0;

3. NaNInfinity

特殊值

double nan = Double.NaN;
double inf = Double.POSITIVE_INFINITY;

坑点

  • NaN == NaNfalse
System.out.println(Double.NaN == Double.NaN); // false
  • 运算可能产生 NaN
System.out.println(0.0 / 0.0); // NaN

正确判断

Double.isNaN(x);
Double.isInfinite(x);

4. 自动拆箱 NPE

Double d = null;
double x = d; // NullPointerException

坑点

  • Double → double 自动拆箱
  • 数据库 / JSON / Map 中很容易出现 null

建议

  • 明确判空
  • 或用 Optional<Double>

5. 大数误差累积

double sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += 0.1;
}

现象

  • 结果明显偏离 100000.0

建议

  • 科学计算:Kahan 求和
  • 金融:BigDecimal

6. Double.parseDouble 的异常

Double.parseDouble("1.2.3"); // NumberFormatException
Double.parseDouble("");      // NumberFormatException

建议

  • try-catch
  • 或正则校验

7. 格式化输出误差

System.out.println(1.345 * 100); // 134.49999999999997

建议

BigDecimal.valueOf(1.345).multiply(BigDecimal.valueOf(100));

8. 比较大小不要用减法

if (a - b < 0) // 危险

风险

  • 溢出
  • NaN 问题

正确

Double.compare(a, b) < 0;

总结一句话

double 适合“近似计算”,不适合“精确计算”

使用建议速查

场景 推荐
金额 BigDecimal
科学计算 double
比较相等 误差 / compare
可能为 null 小心拆箱

如果你愿意,我也可以:

  • BigDecimal 正确写法示例
  • double 在 JVM / 数据库里的坑
  • 或结合你具体业务场景分析
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI