You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Double类中NaN、POSITIVE_INFINITY等常量取值及自赋值原理问询

Java Double类特殊常量的取值与自赋值机制详解

嘿,这个问题问到点子上了!很多人第一次看到Double类的这段源码都会懵——怎么常量还能赋值给自己?别急,咱们一步步说清楚:

一、各个常量的实际取值

这些都是IEEE 754双精度浮点数标准定义的特殊值,具体含义和取值如下:

  • POSITIVE_INFINITY:正无穷大,对应数学意义上的正无穷,数值上大于任何有限的double值,你可以通过计算1.0 / 0.0得到它。
  • NEGATIVE_INFINITY:负无穷大,小于任何有限的double值,对应-1.0 / 0.0的计算结果。
  • NaN:全称Not a Number(非数值),用来表示无效的数值运算结果(比如0.0 / 0.0或者Math.sqrt(-1))。要注意的是,NaN和任何值(包括它自己)的比较结果都是false。
  • MAX_VALUE:double类型能表示的最大有限正数值,具体值约为1.7976931348623157e+308。
  • MIN_VALUE:double类型能表示的最小正数值(不是负数的最小值),是一个极其接近0的正数,约为4.9e-324。

二、自赋值写法的实现机制

先看你贴的这段源码:

public final class Double extends Number implements Comparable<Double> { 
    public static final double POSITIVE_INFINITY = POSITIVE_INFINITY; 
    public static final double NEGATIVE_INFINITY = NEGATIVE_INFINITY; 
    public static final double NaN = NaN; 
    public static final double MAX_VALUE = MAX_VALUE; 
    public static final double MIN_VALUE = MIN_VALUE; 
    // ... 其他代码
}

乍一看这完全是循环定义,但实际上这是Java编译器和JVM针对特殊浮点常量做的底层特殊处理:

这些常量属于Java语言规范中预定义的特殊浮点值,编译器在编译这段代码时,并不会把右边的POSITIVE_INFINITY当成普通变量来解析,而是直接将整个字段替换为对应的IEEE 754标准的二进制常量值。

换句话说,JVM在加载Double类的时候,会直接把这些字段初始化为对应的特殊浮点值(比如正无穷对应的二进制表示),完全跳过了表面上的自赋值逻辑。这是Java为了兼容IEEE 754标准,对基础类型的核心常量做的专属优化,避免了编译和运行时的循环依赖问题。

内容的提问来源于stack exchange,提问作者Gurwinder Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:48