在 Java 中使用 double(及 Double)时,有不少常见“坑点”,很多都源于浮点数的二进制表示本质。下面按「原理 → 现象 → 示例 → 建议」来说明。
double 是 IEEE 754 二进制浮点数,很多十进制小数无法精确表示。
System.out.println(0.1 + 0.2);
// 输出:0.30000000000000004
System.out.println(0.1 + 0.2 == 0.3); // false
BigDecimalMath.abs(a - b) < 1e-9
Double 比较的陷阱Double a = 0.1;
Double b = 0.1;
System.out.println(a == b); // 可能 false
Double 是对象,== 比较的是引用a.equals(b);
// 或
Double.compare(a, b) == 0;
NaN 和 Infinitydouble nan = Double.NaN;
double inf = Double.POSITIVE_INFINITY;
NaN == NaN 是 falseSystem.out.println(Double.NaN == Double.NaN); // false
NaNSystem.out.println(0.0 / 0.0); // NaN
Double.isNaN(x);
Double.isInfinite(x);
Double d = null;
double x = d; // NullPointerException
Double → double 自动拆箱nullOptional<Double>double sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += 0.1;
}
100000.0Double.parseDouble 的异常Double.parseDouble("1.2.3"); // NumberFormatException
Double.parseDouble(""); // NumberFormatException
try-catchSystem.out.println(1.345 * 100); // 134.49999999999997
BigDecimal.valueOf(1.345).multiply(BigDecimal.valueOf(100));
if (a - b < 0) // 危险
Double.compare(a, b) < 0;
double 适合“近似计算”,不适合“精确计算”
| 场景 | 推荐 |
|---|---|
| 金额 | BigDecimal |
| 科学计算 | double |
| 比较相等 | 误差 / compare |
| 可能为 null | 小心拆箱 |
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。