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

问题描述 投票:0回答:2

我的问题与this one一致,但我需要这样做而不会产生任何开销。

java中的本地parseDouble()接受一个字符串,但我的情况给了我一个原始内存的缓冲区,我可以通过buf.getByte(int position)访问。由于我的用例一次处理数十万个这样的双打,因此为每个用户创建一个新的字符串很笨拙。

因此,我需要一种方法来从double的字节表示(缓冲区保持字符/字节表示11.1的{'1''1''。'1'}到Double,而不在堆上创建其他对象这样做。

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

java string parsing double
2个回答
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。


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;

}

© www.soinside.com 2019 - 2024. All rights reserved.