Como impedir o arredondamento de um número ao trocar o tipo?

Pessoal, eu estou tentando fazer um encode da base 64 para hexa, mas o que acontece é que alguns valores estão saindo diferente do que deveriam… isso se da ao tentar passar a variavel double para long, ela automaticamente arredonda o número, ficando diferente por 1 ou 2 valores… como impeço isso? Segue código:

public static String numberToBase64Hexa(String numero) throws PortalException {
// char 0 = 52 (base 64)
// char 1 = 53 (base 64)
// …
// char 9 = 61 (base 64)

  if(numero == null || "".equals(numero))
  	return "0";
  
  final double ZERO_BASE64 = 52d;
  double valorBase64 = 0d;
  int tamanho = numero.length();
  try {
  	// multiplica cada digito pelo correspondente a base
  	// ex.: 310 = (55 x 64^2) + (53 * 64^1) + (52 * 64^0) = 228724
  	// pois 3 = 55, 1 = 53, 0 = 52
  	for (int i = 0; i != tamanho; i++) {
  		char caracter = numero.charAt(i);
  		double digito = Double.parseDouble(Character.toString(caracter));
  		double posicaoDigito = ((tamanho - 1) - i);
  		double potencia64 = Math.pow(64d, posicaoDigito);
  		valorBase64 += ((ZERO_BASE64 + digito) * potencia64);
  	}
  } catch (NumberFormatException e) {
  	throw new PortalException("O valor não pode ser encriptado - valor: " + numero);
  }
  return hexa((long) valorBase64);

}

private static String hexa(long valor){
StringBuilder sb = new StringBuilder();

  char[] hexa = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  long resto;
  if (valor != 0) {
  	// adiciona o 'resto' ao início da String de retorno
  	while (valor > 0) {
  		resto = valor % 16;
  		int r = ((int) resto);
  		valor = valor / 16;
  		sb.insert(0, hexa[r]);
  	}
  }
  return sb.toString().toUpperCase();

}