我正在发送一个无符号的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;
}