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

multiplicar float

Estas en el tema de multiplicar float en el foro de Java en Foros del Web. Buenas, llevo toda la tarde intentando solucionar este problema y no lo consigo. Tengo una columna en un txt que tengo que multiplicarla por 1000(primero ...
  #1 (permalink)  
Antiguo 16/07/2012, 10:45
 
Fecha de Ingreso: diciembre-2010
Mensajes: 41
Antigüedad: 13 años, 4 meses
Puntos: 0
multiplicar float

Buenas,

llevo toda la tarde intentando solucionar este problema y no lo consigo. Tengo una columna en un txt que tengo que multiplicarla por 1000(primero paso de string a float, lo multiplico por 1000 y luego lo paso a string otra vez).

En la lista tengo guardada todas las lineas, y en str guardo los valores a multiplicar. Aqui el codigo:


Código Java:
Ver original
  1. float flo;
  2. String str;
  3. for(int i = 0; i < lista.size(); i++)
  4. {
  5. fichTxt aux = lista.get(i);                    
  6.  
  7. //A la derecha pongo lo que me sale en el debug
  8. str = aux.getcoordY(); // str = -16.30
  9. flo = Float.parseFloat(str);  // flo = -16.3
  10. float mil = 1000;  // mil = 1000
  11. float resAux = flo * mil;  // resAux  -16315.999 ???
  12. str = String.valueOf(flo); // str = -16299.999
  13. }

¿Que hago mal? El 98% de las veces lo hace bien(devuelve el dato multiplicado por 1000 bien), pero algunas en particular lo hace mal(Como el ejemplo que he puesto).

Por que si multiplico -16.3 x 1000 no m devuelve -16300.0??

Por ejemplo con 4.9, resAux si que me devuelve 4900.0...

Saludos y gracias adelantadas
  #2 (permalink)  
Antiguo 16/07/2012, 12:23
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: multiplicar float

Trata usando double en lugar de float
  #3 (permalink)  
Antiguo 17/07/2012, 01:58
 
Fecha de Ingreso: diciembre-2010
Mensajes: 41
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: multiplicar float

Cita:
Iniciado por posman Ver Mensaje
Trata usando double en lugar de float
Pasa algo diferente ya que con float algunos valores se van por milesimas como el ejemplo:

con float: sale -16299.999 cuando deberia ser -16300.00

con double al multiplicar 16.10 x 1000 me sale 161.000.000.000.000.000 como resultado final...

Saludos

EDIT:

estoy probando otras cosas y esto me parece rarisimo:

float var1 = (float)-16.4; // var1 = -16.4
float var2 = (float)-16.3; // var2 = -16.3

float res1 = (float) var1 * (float) 1000.0; // res1 = -16400.0
float res2 = (float )var2 * (float) 1000.0; // res2 = -16315.999 ???

Saludos

Última edición por larkinhos; 17/07/2012 a las 03:18
  #4 (permalink)  
Antiguo 17/07/2012, 04:11
 
Fecha de Ingreso: marzo-2012
Ubicación: Madrid
Mensajes: 74
Antigüedad: 12 años, 1 mes
Puntos: 12
Respuesta: multiplicar float

Me suena que si necesitas precision en los calculos, no sirve la aritmetica con numeros de coma flotante (float, double...).

Necesitas emplear BigDecimal. Mas incomodos de manejar, pero que te garantizan la precision.
http://docs.oracle.com/javase/1.5.0/...igDecimal.html
  #5 (permalink)  
Antiguo 17/07/2012, 05:37
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: multiplicar float

Sip, para hacer operaciones de ese tipo mejor usar BigDecimal.

Mejores conversiones, para evitar duendes ... son

Convertir float a String
Crear BigDecimal con ese String como parámetro
Realizar la operación con de producto (revisa la API para multiplicar BigDecimals)
Covertir el BigDecimal resultante a String.
Si el String es convertible a float, pues se convierte, si no tendrías que usar double.

PD: La adición de múltiples BigDecimal es un mundo aparte, mejor lo dejamos para otra sesión, jaja :D
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #6 (permalink)  
Antiguo 17/07/2012, 21:10
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años
Puntos: 69
Respuesta: multiplicar float

Igual no se si te sirva... pero hay un estandar internacional de calculos exactos, o algo asi...

Java tiene una palabra reservada para indicar que los calculos que se realicen se ajusten a ese estandar internacional, asi en cual quier máquina que se ejecute el programa las cifras no deben variar (ya que hay PCs mas exactas que otras)...

Para esto, usa "strictfp" en tu bloque de código (métodos y creo que clases también?), cualquier calculo que se haga alli, sus valores serán normalizados a los valores estandarizados...
__________________
De nada, hay te encargo +1...

Etiquetas: float, multiplicar, string
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:56.