double是8字节双精度浮点数,遵循ieee 754标准(1位符号+11位指数+52位尾数),有效数字约15–17位,取值范围约±1.797×10³⁰⁸,溢出变infinity,下溢归零,存在0.1+0.2≠0.3等精度问题,金融等场景应避免直接使用。

Java 中 double 类型是默认的双精度浮点数,实际开发中它不是“看起来够用”就行,而是要清楚它的边界和代价——尤其在金融、科学计算或高并发数据处理场景下。
double 占 8 字节,但不只是“更大”的 float
它固定占用 64 位(8 字节)内存,采用 IEEE 754 标准存储:1 位符号 + 11 位指数 + 52 位尾数。这决定了它不是简单地“比 float 多存几位”,而是从根本上支持更宽范围与更高精度的平衡。
- 有效数字约 15–17 位十进制(不是小数点后多少位,而是整个数字的可靠位数)
- 例如:
123456789012345.0能精确表示,但1234567890123456.0可能丢失末位精度 - 声明时无需后缀:
double x = 3.141592653589793;编译器自动识别为 double
取值范围极大,但超出会静默溢出
double 的理论最小值约为 -1.7976931348623157×10³⁰⁸,最大值约为 +1.7976931348623157×10³⁰⁸。超出这个范围不会报错,而是变成 Infinity 或 -Infinity。
- 测试溢出:
double big = Double.MAX_VALUE; System.out.println(big * 2); // 输出 Infinity - 接近零的极小值(如
Double.MIN_NORMAL≈ 2.225×10⁻³⁰⁸)再继续除以 2,会变成0.0(非异常,而是下溢归零) - 实际项目中建议对关键计算做范围校验,比如金融系统中避免用 double 做金额累加
精度陷阱:0.1 + 0.2 ≠ 0.3 是常态
因为十进制小数很多无法用二进制精确表示,double 只能近似存储。这不是 bug,而是浮点数的本质限制。
System.out.println(0.1 + 0.2 == 0.3); // 输出 false- 输出值其实是
0.30000000000000004,误差在第 16 位左右 - 业务敏感场景(如计费、库存)应改用
BigDecimal,或约定统一缩放为 long 运算(例如金额单位转为“分”)
性能与内存:现代 JVM 下 double 并不慢
虽然 double 占用内存是 float 的两倍,但在主流硬件和 HotSpot JVM 上,double 运算速度与 float 差异已微乎其微。JIT 编译器对 double 的优化非常成熟。
- 除非明确受限于嵌入式设备或超大规模向量计算(如 GPU 渲染),否则不要为“怕慢”而降级用 float
- 内存压力主要来自海量对象字段(如百万级 POJO 中每个都存 double),此时可评估是否冗余存储或序列化压缩
- 注意:
double是基本类型,无对象开销;但装箱成Double会产生 GC 压力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











