<分区>
我正在开发一个低延迟系统,需要一个解决方案来将 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);
}
请为我建议最好的方法。