double.doubletolongbits 返回 double 的 ieee 754 64 位标准化位模式 long 值,用于位级比较、哈希计算等;它将所有 nan 映射为同一值,而 doubletorawlongbits 保留原始位。

Double.doubleToLongBits 是 Java 中用于获取 double 类型数值**标准化位模式**的静态方法,返回一个 long 值,其二进制表示与该 double 在内存中的 IEEE 754 64 位(双精度)布局完全一致。
它和直接强制类型转换的区别
很多人误以为 (long)doubleValue 或 Long.valueOf(doubleValue).longValue() 能拿到位表示——其实不是。这些操作是**数值转换**,会截断小数、溢出或四舍五入;而 doubleToLongBits 是**位级拷贝**,不改变任何 bit。
-
Double.doubleToLongBits(0.0)→0L(所有位为 0) -
Double.doubleToLongBits(-0.0)→0x8000000000000000L(符号位为 1,其余为 0) -
(long)(-0.0)→0L(数值转换后符号丢失)
为什么用 doubleToLongBits 而不是 doubleToRawLongBits
IEEE 754 规定:+0.0 和 -0.0 数值相等(0.0 == -0.0 为 true),但位模式不同;同样,不同 NaN 的位模式也不同,但它们互相不相等。
-
doubleToLongBits对所有NaN值返回**同一个规范化的 NaN 位模式**(即0x7ff8000000000000L) -
doubleToRawLongBits则保留原始位——区分不同 NaN、保留 -0.0 的符号位 - 若需做精确位比较(比如序列化、哈希计算、调试内存布局),通常选
doubleToRawLongBits;若要保证NaN == NaN在哈希/集合中行为一致,用doubleToLongBits
怎么查看实际的 64 位二进制
拿到 long 结果后,可用 Long.toBinaryString 查看,但注意它**不补前导零**。要完整显示 64 位,需手动格式化:
double d = -12.34;
long bits = Double.doubleToLongBits(d);
String binary = String.format("%64s", Long.toBinaryString(bits)).replace(' ', '0');
// 输出:1100000000101000101000111101011100001010001111010111000010100011
前 1 位是符号位,接下来 11 位是指数,最后 52 位是尾数(含隐含的 1)。
典型用途
- 实现自定义
hashCode():避免-0.0和0.0哈希值不同(用doubleToLongBits) - 浮点数序列化/反序列化时保持位精确性(尤其科学计算、金融系统)
- 调试:对比两个
double是否真的“位相同”,而非仅数值相等 - 实现
java.util.Double.compare()底层逻辑(基于位比较)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











