It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center




已关闭8年。




我正在一个低延迟的系统上工作,需要一个解决方案将 double 数字转换为字节数组,但精度要求十进制数字。我需要考虑解决方案中应减少对象创建。另外,我得到的值(value)是原来的两倍。

我当前的实现有点像
int offset = 0;
double d = 1211.11;
long integerPart = (long) d;
byte[] b = new byte[16];

offset += addToByteArray(integerPart, b, offset);
//implementation to add each digit to byte array, returns new offset

int lengthDecimal = 16 - offset;
if(lengthDecimal > 0)
b[offset++] = '.';
long tmp = 1;

for(int i=0; i<lengthDecimal; i++){
 tmp = tmp * 10;
 int digit = (int)(((long) (d * tmp)) % 10);
 b[offset++] = (byte) ('0' + digit);
}

然后,操作字节数组以修剪后面的零和“。”。如果需要的话。

问题是如果我检查字节数组,我找不到确切的数字。由于我使用的是double,因此工作时会丢失小数点的精度。

我搜索并发现到处都可以使用BigDecimal。使用BigDecimal似乎可以很好地工作,但是我担心代码的这一部分经常被击中时所创建的对象的性能和数量。

我也曾尝试像这样使用String
String doubleNumber = Double.toString(d);
long fractionalPart = 0;

offset += addToByteArray(integerPart, b, offset);
if(doubleNumber.substring(doubleNumber.indexOf(".")).length() > 0) {
  fractionalPart = Long.valueOf(doubleNumber.substring(doubleNumber.indexOf(".") + 1));
  b[offset++] = '.';
  offset += addToByteArray(fractionalPart, b, offset);
}

请为我建议用于此目的的最佳方法。

最佳答案

byte[] bytes = new byte[8];
java.nio.ByteBuffer.wrap(bytes).putDouble(yourDouble);

关于java - 在Java中将 double 值转换为字节数组的最佳,高效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14062904/

10-11 21:39