将无符号的64位十进制转换为Java double

时间:2014-06-12 20:59:08

标签: java

我发送的是无符号的64位十进制值,我需要将其存储为double,当然这是签名的。

意识到使用最重要的位值会失去一点精确度,实现这一目标的最佳方法是什么?

也许有办法使用Double.doubleToLongBits()BigDecimal类来操纵无符号值?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果你真的是指"长#34;中的无符号64位二进制值,你可以将该long转换为double(使用强制转换),然后,如果long为负数,则添加2 64 为双(18446744073709551616.0)

另一方面,如果你的意思是"十进制整数在转换为二进制"时可能会溢出63位,你只需将字符串直接转换为DOUBLE.parseDouble加倍

答案 1 :(得分:0)

如果您的意思是“很长的无符号64位二进制值”,那么Guava可以提供帮助:

import com.google.common.primitives.UnsignedLong;
...
long value = -1L; // max unsigned long = 2^64-1
double dValue = UnsignedLong.fromLongBits(value).doubleValue(); // 1.8446744073709552E19

在内部,其工作方式如下(see the source of UnsignedLong):

double dValue = (double) (value & 0x7fffffffffffffffL);
if (value < 0) {
    dValue += 0x1.0p63;
}