我的问题与this one一致,但我需要做到这一点而又不增加任何开销。
java中的本机parseDouble()
接受了一个字符串,但是我的情况为我提供了可以通过buf.getByte(int position)
访问的原始内存缓冲区。由于我的用例一次处理数十万个这样的双精度数,因此为每个数字创建新的String既麻烦又缓慢。
因此,我需要一种方法,从双精度型的字节表示形式(缓冲区中的字符/字节代表11.1的{'1''1''。''1'}的字符/字节)变为双精度型,而无需创建其他对象这样做时在堆上。
任何帮助将不胜感激!谢谢。
答案 0 :(得分:1)
粗暴,hacky,无法与底片配合使用,但是您可以做一些腿部工作来支撑它:
private static double toDouble(byte[] bs) {
boolean onLeft = true;
double left = 0;
double right = 0;
for (byte b : bs) {
if (b == '.') {
onLeft = false;
} else if (onLeft) {
left *= 10;
left += b - '0';
} else {
right += b - '0';
right /= 10;
}
}
return left + right;
}
并且:
System.out.println(toDouble(new byte[] { '1', '1', '.', '1' }));
收益11.1。
答案 1 :(得分:0)
其他答案的内容,
public static double arr2double(char[] arr) {
double num = 0;
double num2 = 0;
int idForDot=arr.length;
boolean isNeg = false;
char[] st = null;
int start = 0;
int end = arr.length;
boolean hasDot=false;
if (arr[0] == '-') {
isNeg = true;
start++;
} else if (arr[0] == '+')
start++;
for(int i = start; i < arr.length; i++)
if (arr[i] == '.') {
hasDot=true;
idForDot=i;
for (int j = arr.length - 1; j >= idForDot + 1; j--)
num2 = (num2 + arr[j] - '0') / 10;
break;
}
if (hasDot)
st = Arrays.copyOfRange(arr, 0, idForDot);
else
st = arr;
for (int i = start; i < st.length; i++) {
if (st[i] == ',')
continue;
num *= 10;
num += st[i] - '0';
}
num = num + num2;
if (isNeg)
num = -1 * num;
return num;
}