Author Topic: Trabajar con 2 decimales en JAVA  (Read 64528 times)

luisalb

  • Newbie
  • *
  • Posts: 36
  • Karma: 0
    • View Profile
Trabajar con 2 decimales en JAVA
« on: Diciembre 27, 2008, 02:52:53 pm »
Hola a todos los miembros del foro. A propósito, felíz navidad y en próspero año 2009 para todos.

Mi consulta es la siguiente: Tengo un jtextfield donde calculo el subtotal de una factura, pero el problema es que el tipo de dato es DOUBLE, y al momento de pasarle el valor pasa con varios decimales. Por ejemplo: 145.00000058

Por favor me pueden ayudar a tomar solo 2 decimales, para el caso 145.00

Ah y otra consulta, como hago para redondear 145.17000045 a 145.20.

Muchas gracias por sus respuestas.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 4949
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Trabajar con 2 decimales en JAVA
« Reply #1 on: Diciembre 27, 2008, 03:41:42 pm »
Hola:

Es un problema general en cualquier lenguaje de programación. El motivo es que con un número finito de bits (64 para los double) no se pueden representar todos los números decimales con todas sus posibles combinaciones. Por ello, es habitual que haya algunos cambios "inexplicables" en los últimos decimales. Por ejemplo, si debe salir 1.0, quizás te salga 0.9999999999 o 1.00000001

Como esto suele molestar principalmente en la representación en pantalla, lo habitual es usar algún tipo de formateador para el texto en pantalla. En java tienes la clase DecimalFormat, a la que dándole un patrón estilo "#########.##" escribirá con dos decimales solamente.

En cuanto al redondeo, tienes que hacerlo con alguna operación. Por ejemplo, si quieres que redondee los últimos dos decimales, multiplica por 100, usa Math.round() para obtener un entero y luego vulve a dividir por 100.

En el ejemplo que pones, si quieres dos decimales pero que el último siempre sea cero (145.17 a 145.20), debes multiplicar por 10, round() y dividir por 10. Luego, usa un patrón "###.##" para escribirlo con dos decimales, o incluso "###.#0"

Se bueno

luisalb

  • Newbie
  • *
  • Posts: 36
  • Karma: 0
    • View Profile
Re: Trabajar con 2 decimales en JAVA
« Reply #2 on: Diciembre 28, 2008, 03:59:06 am »
Gracias por responder chuidiang.

Pero ahora mi problema es que despues de aplicar el siguiente codigo:

subtotal = (Double.valueOf(JTF_PrecioProd.getText().toString()) - Double.valueOf(JTF_DescuentoProd.getText())) * Integer.parseInt(JTF_CantidadProd.getText().toString());                       
       
DecimalFormat formateador = new DecimalFormat("########.###");
       
        JTF_SubtotalProd.setText(String.valueOf(Double.valueOf(formateador.format(subtotal))));       

En la  JTF_SubtotalProd (caja de texto), el formato decimal aparece separado por una coma (ej. 145,23) y eso me dificulta realizar operaciones con el dato que obtengo en la caja de texto; ya que necesito tener el valor separado con punto (ej. 145.23)

Por favor ayudenme a resolver este problema.

Muchas gracias por sus respuestas.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 4949
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Trabajar con 2 decimales en JAVA
« Reply #3 on: Diciembre 28, 2008, 09:26:31 am »
Hola:

Java (o windows) a veces es demasiado inteligente y como el idioma tuyo por defecto es español, pone una coma en vez de un punto decimal.

Si no te molesta a efectos de representación, déjalo ahí. Cuando obtengas el texto puedes o bien usar la misma clase DecimalFormat y su método parse() para obtener el valor (en vez de Integer o Double). Esta clase DecimalFormat, igual que pone la coma, la entiende.

Otra opción es después de obtener el texto, llamar al método replaceAll() de la clase String, para cambiar todos los , por .

Finalmente, otra opción, es indicarle a la clase DecimalFormat, que use un punto en vez de una coma, llamando a setDecimalFormatSymbols(). Puedes llamar primero a getDecimalFormatSymbols() para obtener los de defecto, cambiar el setDecimalSeparator() y luego llamar al setDecimalFormatSymbols().

Code: [Select]
DecimalFormatSymbols dfs = formateador.getDecimalFormatSymbols();
dfs.setDecimalSeparator('.');
formateador.setDecimalFormatSymbols(dfs);

Dependiendo de cómo esté hecho el getDecimalFormatSymbols() por dentro, puede que incluso te sobre la línea de setDecimalFormatSymbols().

Puedes mirar más detalles en este tutorial, en el apartado DecimalFormatSymbols de DecimalFormat.

Se bueno.
« Last Edit: Diciembre 28, 2008, 09:28:25 am by chuidiang »

luisalb

  • Newbie
  • *
  • Posts: 36
  • Karma: 0
    • View Profile
Re: Trabajar con 2 decimales en JAVA
« Reply #4 on: Diciembre 28, 2008, 09:31:00 pm »
Otra vez gracias por responder chuidiang. Ya logre solucionar mi problema con lo último que publicaste, de verdad quedo muy agradecido.

Tengo otra consulta: En  cuanto a la declaración de una variable del tipo DOUBLE. Cual de las siguientes formas es la mejor:

Double impuestos = null;
Double impuestos = Double.valueOf(0);
double impuestos = 0;

La verdad es que he probado todas e igual me funcionan, pero quisiera saber cual es la mejor o en que casos específicamente sirve cada una.

Muchas gracias por sus respuestas.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 4949
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Trabajar con 2 decimales en JAVA
« Reply #5 on: Diciembre 29, 2008, 09:47:21 am »
Hola:

null es null, es decir, sin valor, no un 0, sino sin valor. Es válido si por ejemplo todos los valores son posibles (incluido el 0) y usas null como "sin valor".

Double con mayúscula es una clase, double con minúscula es una primitiva. double no admite null y hay que darle un valor. Double admite null, pero consume más memoria y tiene muchos métodos que double (al no ser clase) no tiene. Sin embargo, con Double no se puede operar (multiplicar, sumar, etc) mientras que con double sí.

Usa Double si quieres guardar estos en algún sitio que admita Object (ArrayList, Hashtable, LinkedList, etc) o necesitas tener la posibilidad de que sea null. Usa double en cualquier otro caso, ya que es más eficiente y puedes hacer operaciones con él.

Hay diferencias similares entre int e Integer, char y Character, Long y long, Float y float, etc.

Se bueno.