java - print - Convertir doble a matriz int
java round double to int (6)
Tengo un doble
double pi = 3.1415;
Quiero convertir esto a una matriz int
int[] piArray = {3,1,4,1,5};
Se me ocurrió esto
double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
piArray[i] = piString.charAt(i) - ''0'';
Funciona, pero no me gusta esta solución porque creo que muchas conversiones entre tipos de datos pueden generar errores. ¿Mi código está completo o necesito verificar otra cosa?
¿Y cómo abordarías este problema?
Esta solución no hace suposiciones y utiliza la manipulación de cadenas para obtener el resultado que desea. Obtiene el doble, lo convierte en una cadena, elimina los caracteres ilegales, luego convierte cada uno de los caracteres restantes en caracteres y los almacena en la matriz, en el orden en que aparecen en el doble
double pi = 3.1415;
String temp = ""+ pi;
String str = "";
String validChars = "0123456789";
//this removes all non digit characters
//so ''.'' and ''+'' and ''-'' same as string replace(this withThat)
for(int i =0; i<temp.length(); i++){
if(validChars.indexOf(temp.charAt(i)) > -1 ){
str = str +temp.charAt(i);
}
}
int[] result = new int[str.length()];
for(int i =0; i<str.length(); i++){
result[i] = Integer.parseInt(""+str.charAt(i));
System.out.print(result[i]);
}
return result; //your array of ints
No sé directamente, pero creo que es más simple:
int[] piArray = String.valueOf(pi)
.replaceAll("//D", "")
.chars()
.map(Character::getNumericValue)
.toArray();
Se puede utilizar en java 8.
int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
Ya que quiere evitar los lanzamientos, aquí está la forma aritmética, suponiendo que solo tiene que tratar con números positivos:
List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
int mostSignificantDigit = (int) current;
piList.add(mostSignificantDigit);
current = (current - mostSignificantDigit) * 10;
}
El manejo de los números negativos se puede hacer fácilmente al verificar el signo al principio y luego usar el mismo código con current = Math.abs(pi)
.
Tenga en cuenta que, debido a la aritmética de punto flotante, le dará resultados que podría no esperar para valores que no se pueden representar perfectamente en binario.
Here una idea que ilustra el problema y donde puedes probar mi código.
esto funcionaria tambien
int[] piArray = piString.chars().map(c -> c-''0'').toArray();
int[] result = Stream.of(pi)
.map(String::valueOf)
.flatMap(x -> Arrays.stream(x.split("//.|")))
.filter(x -> !x.isEmpty())
.mapToInt(Integer::valueOf)
.toArray();
O un enfoque más seguro con java-9
:
int[] result = new Scanner(String.valueOf(pi))
.findAll(Pattern.compile("//d"))
.map(MatchResult::group)
.mapToInt(Integer::valueOf)
.toArray();