java中的double vs long序列化
发布时间:2020-05-25 17:25:06 所属栏目:Java 来源:互联网
导读:我可以将一个数字存储为HBase中的Long和Double.它们都在 Java中占用8个字节. 使用Double的优点在于它为存储整数提供了更宽的范围. 但是,我认为Long的范围也足以供我使用. 有没有人对Long vs Dobule的序列化和反序列化性能有任何想法?我有兴趣比较它们. 谢谢.
|
我可以将一个数字存储为HBase中的Long和Double.它们都在 Java中占用8个字节. 使用Double的优点在于它为存储整数提供了更宽的范围. 但是,我认为Long的范围也足以供我使用. 有没有人对Long vs Dobule的序列化和反序列化性能有任何想法?我有兴趣比较它们. 谢谢. 解决方法如果要存储整数,请使用Long.您的声明“使用Double的优点是它为存储整数提供了更广泛的范围”是不正确的.两者都是64位长,但是必须使用一些位作为指数,留下更少的位来表示幅度.您可以将较大的数字存储在一个双精度数中,但会丢失精度.换句话说,对于大于某个上限的数字,您不能再存储相邻的“整数”…给定高于此阈值的整数值,“下一个”可能的双倍将比前一个数字大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 %dn%f %f %f",long1,long2,dbl1,dbl2,dbl3);
}
}
这输出: 9223372036854775707 9223372036854775708 9223372036854776000.000000 9223372036854776000.000000 9223372036854778000.000000 注意 > Long.MAX_VALUE-100的双重表示不等于原始值 另一种说法是long只有不到19位的精度,而double只有16位精度. Double可以存储大于16位的数字,但代价是以低位数字截断/舍入. 如果您需要超过19位数的精度,您必须使用BigInteger,预期性能会下降. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
