私は低遅延システムに取り組んでおり、2 進数をバイト配列に変換するソリューションが必要ですが、10 進数の精度は必要です。ソリューション内でのオブジェクトの作成を減らす必要があることを考慮する必要があります。また、私は二重の価値を得ています。
私の現在の実装はやや似ています
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 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);
}
目的に最適なアプローチを提案してください。