如何在不创建String对象开销的情况下将包含double值的char数组转换为double变量?

时间:2019-03-18 20:27:23

标签: java string parsing double

我的问题与this one一致,但我需要做到这一点而又不增加任何开销。

java中的本机parseDouble()接受了一个字符串,但是我的情况为我提供了可以通过buf.getByte(int position)访问的原始内存缓冲区。由于我的用例一次处理数十万个这样的双精度数,因此为每个数字创建新的String既麻烦又缓慢。

因此,我需要一种方法,从双精度型的字节表示形式(缓冲区中的字符/字节代表11.1的{'1''1''。''1'}的字符/字节)变为双精度型,而无需创建其他对象这样做时在堆上。

任何帮助将不胜感激!谢谢。

2 个答案:

答案 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;

}