java float 不能序列化_java中的double vs long序列化

如果要存储整数,请使用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 %d\n%f %f %f",long1,long2,dbl1,dbl2,dbl3);

}

}

这输出:

9223372036854775707 9223372036854775708

9223372036854776000.000000 9223372036854776000.000000 9223372036854778000.000000

注意

> Long.MAX_VALUE-100的双重表示不等于原始值

>在Long.MAX_VALUE-100的双重表示中添加1无效

>在这个幅度上,一个双倍和下一个可能的双重值之间的差异是2000.

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值