IEEE二进制浮点数算术标准(IEEE754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。
public static long doubleToLongBits(double value);
//源码
public static long doubleToLongBits(double value) {
long result = doubleToRawLongBits(value);
// Check for NaN based on values of bit fields, maximum
// exponent and nonzero significand.
if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
DoubleConsts.EXP_BIT_MASK) &&
(result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
result = 0x7ff8000000000000L;
return result;
}
根据 IEEE 754 浮点双精度格式 (“double format”) 位布局,返回指定浮点值的表示形式
如果参数是正无穷大,则结果为 0x7ff0000000000000L
如果参数是负无穷大,则结果为 0xfff0000000000000L
如果参数是 NaN,则结果为 0x7ff8000000000000L
在所有情况下,结果都是一个 long 整数
将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值
(所有 NaN 值被压缩成一个“规范”NaN 值时除外)
也就是NaN的处理不一样,此方法将NaN全部规范化为指定固定的值
简单来说就是你提供一个双精度浮点数,他会用64位二进制表示,如上图符号占1位,指数占11位,尾数占52位。
然后将这个64位的二进制数用long型表示,我们通过long型数值的大小来比较两个浮点数的大小。
通过这个方法有一个缺点就是取值范围,当你提供的浮点数转成二进制后,如果超过了指定的位置就无法比较大小了(单精度32位,双精度64位)
public class Test {
public static void main(String[] args) {
double a = 0.0022001;
double b = 0.0022;
System.out.println("a:" + Double.doubleToLongBits(a));
System.out.println("b:" + Double.doubleToLongBits(b));
System.out.println(Double.doubleToLongBits(a) == Double.doubleToLongBits(b));
}
}