Foros del Web » Programación para mayores de 30 ;) » Java »

Numeros flotantes acotados

Estas en el tema de Numeros flotantes acotados en el foro de Java en Foros del Web. Hola, no se si me puedan ayudar con dos cosas, la primera es por que al hacer una resta en java con doubles por ejemplo ...
  #1 (permalink)  
Antiguo 12/09/2004, 16:56
Avatar de birus  
Fecha de Ingreso: enero-2003
Ubicación: México DF
Mensajes: 47
Antigüedad: 21 años, 4 meses
Puntos: 0
Exclamación Numeros flotantes acotados

Hola, no se si me puedan ayudar con dos cosas, la primera es por que al hacer una resta en java con doubles por ejemplo 15.2-15.0 el resultado es 0.1999999999996 .

La segunda, me dejaron hacer un programa para corregir el error y ademas desplegar el resultado con un cierto numero de decimales, por ejemplo:

15.2 - 15.0 con dos decimales = 0.20


El programa que hice es el siguiente, pero no se como hacer lo de el numero de decimales.

Código:
import java.math.*;

public class RedondeoSBC

   {

     public static void main (String[] args)

        {    
	  
          double aux1,aux2;

          double d1 = Double.parseDouble( args[1] );

          double d2 = Double.parseDouble( args[2] );

          int i = Integer.parseInt( args [0] );
	  
          aux1 = Double.parseDouble(redondeaDecimales(d1,i));
	  aux2 = Double.parseDouble(redondeaDecimales(d2,i));

	  double d3 = aux1-aux2;

	  System.out.println("Resta= "+d3);
        }

public static String redondeaDecimales(double valorSinRedondear, int numeroDeDecimales)
        {
    
    	  BigDecimal bd = new BigDecimal(valorSinRedondear);
	  bd = bd.setScale(numeroDeDecimales, BigDecimal.ROUND_HALF_UP);
          String string = bd.toString();
	  
	  return string;
	  

        } 

  }
Espero su respuesta.
__________________
Sergio Barragán
  #2 (permalink)  
Antiguo 13/09/2004, 10:22
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
el problema de que no una resta de doubles no te da lo que tu crees que da, es por el numero de decimales que tienen asignadas las calculadoras.

por mas buena que sea, siempre tienen un margen de error, ya que los numeros "de llevar" no son los suficientes para hacer una operacion exacta.
como un double tiene muchos numeros, te despliega parte de los que estan mal, el float, no te haria eso en ese tipo de operaciones, solo en una mas grande.

es algo dificil de expllicar, pero si no, prueba con una calculadora chafilla, y has operaciones como 1/3 y luego ese resultado por 3 y veraz que no te da lo que deberia de ser.......

respecto a como corregir el codigo, no se si esto se valga:
Código:
public class Clase{
    public static void main(String args[])
    {
        double a;
        double b;
        a=15.2;
        b=15.0;
        double c=a-b;
        System.out.println((float)c);
    }
}
si se vale, con eso funciona....ya ahi solo arreglale para inserten como quieran....
  #3 (permalink)  
Antiguo 13/09/2004, 14:34
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola, lo que menciona blackwind debe funcionar... recuerden que en JAVA los números decimales son manejados en variables doubles por defecto, es por eso la precisión de los números decimales.

La clase en JAVA que te permite configurar cuantos decimales deseas ver es:
java.text.NumberFormat

Información en:

http://java.sun.com/j2se/1.4.2/docs/...berFormat.html
__________________
Saludos,

H@C..
  #4 (permalink)  
Antiguo 30/05/2008, 07:49
Avatar de poloche  
Fecha de Ingreso: abril-2006
Ubicación: cochabamba
Mensajes: 93
Antigüedad: 18 años
Puntos: 1
Respuesta: Numeros flotantes acotados

holas estimados amigos tengo un problema similar pues necesito manejar varios decimales pero no siempre los mismos, tengo en la base de datos una columna con doubles y pongo los atos resultantes de una division pero para reproducirlos necesito la mayor cantidad de digitos para llegar al numero que habia dividido entonces le doy a redondear con 14 decimales pero si la division fue exacta 1.5 en la base de datos estara 1.50000000000001 lo pero es que cuando le doy un numero mas grande como 2512312545.101022522522 - 0.1 ya no da una resta normal sino
  #5 (permalink)  
Antiguo 30/05/2008, 09:25
Avatar de poloche  
Fecha de Ingreso: abril-2006
Ubicación: cochabamba
Mensajes: 93
Antigüedad: 18 años
Puntos: 1
Respuesta: Numeros flotantes acotados

holas creo que pude solucionar ese problema con los redondeos de la siguiente manera
Cita:
total = total.divide(tc.getMonto(), 14, BigDecimal.ROUND_UP);
descu = descu.divide(tc.getMonto(), 14, BigDecimal.ROUND_UP);
pagar = pagar.divide(tc.getMonto(), 14, BigDecimal.ROUND_UP);
haci solo redondea lo necesario osea si es 14.4 se queda como 14.4
y si es
14.258258258258258258258
lo redondea a esa cantidad con 14 digitos osea
14.258258825825825

hasta ahi creo que se solucionono pero aun me queda algo que tratare de solucionar y estan en las restas
si resto
1445875452.23256-12.36
me da 2.0974455225e108
y eso me esta cusando conflictos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:53.