我正在开发一个低延迟系统,需要一种解决方案来将双精度数转换为字节数组,但对十进制数具有精度。我需要考虑在解决方案中创建的对象应该更少。另外,我的价值是双倍的。
我目前的实现有点像
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);
}
然后操纵字节数组以修剪后面的零和“。” 如果需要。
问题是如果我检查字节数组,我找不到确切的数字。因为,我使用的是双精度,所以在工作时会丢失小数点的精度。
我已经搜索并发现到处都可以使用 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);
}
请建议我为此目的的最佳方法。