将无符号64位十进制转换为Java双精度



我正在发送一个无符号的64位十进制值,并且需要将其存储为double,这当然是有符号的。

意识到使用最高有效位的值会失去一点精度,实现这一点的最佳方法是什么?

也许有一种方法可以使用Double.doubleToLongBits()BigDecimal类来操作无符号值?

提前感谢!

如果你的意思是"unsigned 64-bit binary value ina long",你可以把long转换成double(强制类型转换),然后,如果long是负的,加264作为double (18446744073709551616.0)

另一方面,如果您真正指的是"转换为二进制时可能溢出63位的十进制整数",则可以直接使用DOUBLE.parseDouble

将字符串转换为双精度字符串。

如果您的意思是"无符号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

在内部,它的工作原理如下(参见UnsignedLong的来源):

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

最新更新