Java - Redondeo de decimales

 
Vista:
sin imagen de perfil
Val: 106
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Redondeo de decimales

Publicado por Hector (60 intervenciones) el 21/03/2019 22:19:19
Hola amigos del foro he aquí de nuevo molestando, tengo un pequeño problema que al sumar las cajas de texto y al resultado multiplicarlo por el 19%, lo que quiero es aproximarlo, pero no me funciona, pro ejemplo que el IVA de un resultado de $ 1845.66, lo aproxime a $ 1846 o en su defecto, además que el valor del IVA lo muestre en entero y no con decimales, soy nuevo en esto, así que necesito de su ayuda, este es el código que estoy usando por el momento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void SumaTotalActionPerformed(java.awt.event.ActionEvent evt) {
    int val1 = Integer.parseInt(txtvalmano.getText());
    int val2 = Integer.parseInt(txtvalrep.getText());
    int suma = val1 + val2;
    String valorTotal = Integer.toString(suma);
    txtsubtotal.setText(valorTotal);
    int val3 = Integer.parseInt(txtsubtotal.getText());
    Double suma1 = val3 * 0.19;
    String valorTotal1 = Double.toString(suma1);
    txtiva.setText(valorTotal1.trim());
    int val4 = Integer.parseInt(txtsubtotal.getText());
    int val5 = Integer.parseInt(txtiva.getText());
    int suma2 = val4 + val5;
    String valorTotal2 = Integer.toString(suma2);
    txttotal.setText(valorTotal2);
    txtnota.requestFocus();
}
ojala que me ayuden desde ya muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.328
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Redondeo de decimales

Publicado por Kabuto (922 intervenciones) el 22/03/2019 00:50:34
Puedes usar el método String.format(), que al principio parece confuso, pero no lo es tanto y resulta muy útil.

Por ejemplo, tu objeto Double:
1
Double suma1 = val3 * 0.19;

Supongamos que quieres transformarlo a un String y redondado a solo dos decimales. Lo haces así

1
String valorTotal1 = String.format("%.2f", suma1);

Como ves, a format() le pasamos dos parametros:
- El primero es una cadena donde le indicamos como va a ser el formato.
- El segundo es la variable/objeto que queremos formatear

Entonces, la cadena esa "misteriosa" se interpreta así del siguiente modo:
El símbolo % viene a ser un comodín, indica en que lugar de la cadena se va a mostrar la variable una vez formateada
El .2f significa que vamos a mostrar un valor con decimales (f de float) y que va a ser redondeado a dos decimales.

Otro posible ejemplo:
1
String valorTotal1 = String.format("EL resultado redondeado a 5 decimales es: %.5f", suma1);

Si en cambio quisieras mostrar solo el valor entero, puesto que estás usando un objeto Double, puedes aprovechar su método intValue() y luego parsearlo a String.
1
String valorTotal1 = Integer.toString(suma1.intValue());
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 106
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Redondeo de decimales

Publicado por Hector (60 intervenciones) el 25/03/2019 16:01:48
Muchas gracias por tu ayuda Kabuto, pero mi duda es la siguiente si al formato String le coloco sin decimales ni puntos, es decir solo enteros se puede hacer, ya que es lo que necesito que todo debe ser entero sin pintos ni decimales y debe ser capaz de realizar aproximaciones, con ese formato del string lo hace y muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.328
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Redondeo de decimales

Publicado por Kabuto (922 intervenciones) el 25/03/2019 21:28:03
Cuando quieres mostrar un entero usando String.format(), el símbolo % ha de ir acompañado de una d
%f --> para números reales, ya sean de tipo primitivo double, float, o sus clases equivalentes Double y Float
(no confundamos double con Double, ni float con Float, unos son tipos primitivos, los otros son Clases)

%d --> para números enteros, ya sean tipos primitivos int, short, byte o sus clases equivalentes Integer, etc...

Entonces, cuando usas %d, no puedes pasarle un Double/double. Así que no puedes usarlo con tu objeto suma1.

Has de convertir suma1 en un entero. Para ello, puedes usar el método intValue() que suma1 posee por el hecho de ser de la clase Double.
Y, como en este caso, no necesitas dar un formato especial, solo quieres obtener el valor entero de suma1, en realidad ya no necesitas usar String.format(), te basta con intValue().

Por eso para mostrar el valor entero, te puse este ejemplo, donde obtenemos el valor entero y lo parseamos a String, sin dar ningún formato adicional, porque no lo necesitas:
1
String valorTotal1 = Integer.toString(suma1.intValue());

Ahora bien, supón que SÍ necesitas darle a ese valor entero un formato adicional. Por ejemplo supón que deseas que ese valor entero SIEMPRE ocupe 5 caracteres en pantalla. Porque a lo mejor vas a hacer un listado de muchos precios en pantalla. Y algunos precios tendrán tres cifras, otros cuatro, otros dos...
Esto generalmente provoca que el listado salga feo.
Mira, si usaramos el String valorTotal1 dentro de un bucle para mostrar un listado de precios en pantalla, tal y como lo he puesto arriba sin darle ningún formato, únicamente obteniendo su valor entero, tendríamos algo como esto:

1
2
3
4
5
6
PRECIO            ARTICULO
------            --------
34343    -------> Rolex Dorado con Encajes de Diamantes
90    -------> Funda de Seda.
340    -------> Esfera de Titanio
8    -------> Juego de tornillos de 34 micras de repuesto

Esto ocurre porque el tamaño de caracteres del String valorTotal1 es diferente para cada línea, depende del valor entero del precio.
Y como estamos listando productos con precios muy dispares, el tamaño del String también es muy dispar y el listado sale más bien feo en pantalla. Porque no tiene un formato unificado

Pero con String.format() podemos corregir este asunto, podemos hacer que valorTotal1 tenga un formato fijado, de manera que da igual el valor del entero que va a contener. Podemos decirle que SIEMPRE va a ocupar 5 caracteres en pantalla. Los caracteres que no pueda ocupar con numeros, los ocupará con espacios en blanco. Y así tendremos un formato unificado.

Lo hacemos así:
1
String valorTotal1 = String.format("%5d", suma1.intValue());

Y ahora nuestro listado quedaría algo más elegante:
1
2
3
4
5
6
PRECIO            ARTICULO
------            --------
34343    -------> Rolex Dorado con Encajes de Diamantes
   90    -------> Funda de Seda.
  340    -------> Esfera de Titanio
    8    -------> Juego de tornillos de 34 micras de repuesto

O si quisieramos en lugar de espacios en blanco, podemos decirle que lo rellene con "ceros".
1
String valorTotal1 = String.format("%05d", suma1.intValue());

Y obtenemos esto:
1
2
3
4
5
6
PRECIO            ARTICULO
------            --------
34343    -------> Rolex Dorado con Encajes de Diamantes
00090    -------> Funda de Seda.
00340    -------> Esfera de Titanio
00008    -------> Juego de tornillos de 34 micras de repuesto

Que para mostrar precios puede no ser muy bonito, pero para otros tipos de listados, como pueden ser resultados matemáticos, si puede ser apropiado.

En fin, con String.format() se puede hacer muchas cosas: notaciones científicas, formatear fechas...
Encontrarás muchos ejemplos en la red, como por ejemplo estos: https://dzone.com/articles/java-string-format-examples
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 106
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Redondeo de decimales

Publicado por Hector (60 intervenciones) el 26/03/2019 21:29:36
Kabuto muchas gracias muy buena tu explicación muy didáctica y fácil de entender, me ayudaste harto para que estoy recién empezando en el lenguaje, salio altiro, ahora con lo de la ayuda de los ceros también es buena ya que al ingresar para que queden en un orden y nuevamente muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar