我的问题与this one一致,但我需要这样做而不会产生任何开销。
java中的本地parseDouble()
接受一个字符串,但我的情况给了我一个原始内存的缓冲区,我可以通过buf.getByte(int position)
访问。由于我的用例一次处理数十万个这样的双打,因此为每个用户创建一个新的字符串很笨拙。
因此,我需要一种方法来从double的字节表示(缓冲区保持字符/字节表示11.1的{'1''1''。'1'}到Double,而不在堆上创建其他对象这样做。
任何帮助,将不胜感激!谢谢。
粗暴,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。
在另一个答案的行中,
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;
}