在 Java 里,Double 是 double 的包装类(引用类型),双精度浮点数运算本质上还是按 IEEE 754 64 位浮点数规则 来进行的。下面从「基本运算」「常见坑」「推荐做法」三方面说清楚。
double a = 1.1;
double b = 2.2;
double sum = a + b; // 加
double diff = a - b; // 减
double mul = a * b; // 乘
double div = a / b; // 除
Double x = 1.1;
Double y = 2.2;
Double result = x + y; // 自动拆箱成 double,再装箱
⚠️
Double是对象,运算时会自动拆箱成double
System.out.println(0.1 + 0.2);
// 输出:0.30000000000000004
原因:
double 是二进制浮点数,不能精确表示很多十进制小数。
Double a = 0.1 + 0.2;
Double b = 0.3;
System.out.println(a == b); // false
✅ 正确比较方式:
double eps = 1e-9;
if (Math.abs(a - b) < eps) {
// 认为相等
}
if (Double.compare(a, b) == 0) {
// 不推荐用于浮点误差场景
}
Math.sqrt(x); // 平方根
Math.pow(x, y); // x 的 y 次方
Math.abs(x); // 绝对值
Math.max(a, b);
Math.min(a, b);
Math.round(x); // 四舍五入
Math.floor(x); // 向下取整
Math.ceil(x); // 向上取整
BigDecimal(金额、科学计算必用)import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // 0.3
❗ 不要用:
new BigDecimal(0.1) // 错误,仍然是浮点误差
Double.NaN; // 非数字
Double.POSITIVE_INFINITY;
Double.NEGATIVE_INFINITY;
判断方式:
Double.isNaN(x);
Double.isInfinite(x);
| 场景 | 建议 |
|---|---|
| 普通科学计算 | double |
| 金额 / 精确计算 | BigDecimal |
| 浮点比较 | 用误差范围 |
| 高性能运算 | 避免 Double 对象,用 double |
如果你有具体场景(比如:金额运算 / 算法 / 性能优化 / 和数据库交互),我可以给你更针对性的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。