java中的double vs long序列化

Ani*_*pta 6 java performance serialization hbase deserialization

我可以将一个数字存储为HBase中的Long和Double.它们都在Java中占用8个字节.

使用Double的优点在于它为存储整数提供了更宽的范围.

但是,我认为Long的范围也足以供我使用.

有没有人对Long vs Dobule的序列化和反序列化性能有任何想法?我有兴趣比较它们.

谢谢.

Jim*_*son 21

如果要存储整数,请使用Long.您的声明"使用Double的优点是它为存储整数提供了更广泛的范围"是不正确的.两者都是64位长,但double必须使用一些位作为指数,留下较少的位来表示幅度.您可以在a中存储较大的数字,double但会丢失精度.

换句话说,对于大于某个上限的数字,您不能再存储相邻的"整数"...给定高于此阈值的整数值,"下一个"可能double比前一个数字大1.

例如

public class Test1  
{

    public static void main(String[] args) throws Exception 
    {
        long   long1 = Long.MAX_VALUE - 100L;
        double dbl1  = long1;
        long   long2 = long1+1;
        double dbl2  = dbl1+1;
        double dbl3  = dbl2+Math.ulp(dbl2);

        System.out.printf("%d %d\n%f %f %f", long1, long2, dbl1, dbl2, dbl3);
    }

}
Run Code Online (Sandbox Code Playgroud)

这输出:

9223372036854775707 9223372036854775708
9223372036854776000.000000 9223372036854776000.000000 9223372036854778000.000000
Run Code Online (Sandbox Code Playgroud)

注意

  1. Long.MAX_VALUE-100的双重表示等于原始值
  2. 将1添加到Long.MAX_VALUE-100的双重表示无效
  3. 在这个量级上,一个双倍和下一个可能的双重值之间的差异是2000.

另一种说法是long精度不到19位,而精度double只有16位.Double可以存储大于16位的数字,但代价是以低位数字截断/舍入.

如果您需要超过19位数的精度,您必须求助于BigInteger预期的性能下降.

  • +1 - 表现无关紧要; 这两种类型的目的完全不同. (7认同)