Matemáticas de punto flotante de Java - (conversión para pies / metros)
-
03-07-2019 - |
Pregunta
Creo que es una pregunta bastante básica: estoy realizando esta función:
private double convertMetersToFeet(double meters)
{
//function converts Feet to Meters.
double toFeet = meters;
toFeet = meters*3.2808; // official conversion rate of Meters to Feet
return toFeet;
}
El problema es la salida; por ejemplo, obtengo 337.36080000000004 de una entrada de 101. ¿Cuál es la práctica adecuada para truncar los puntos flotantes?
Como se supone en las respuestas a continuación, quisiera que 4 cifras significativas se mantuvieran consistentes con mi tasa de conversión.
Solución
Puede usar un NumberFormat instancia.
NumberFormat nf = NumberFormat.getInstance(Locale.UK);
nf.setMinimumFractionDigits(4);
nf.setMaximumFractionDigits(4);
System.out.println(nf.format(feet));
O puede usar DecimalFormat .
DecimalFormat df = new DecimalFormat("0.0000");
System.out.println(df.format(feet));
El último (DecimalFormat), se utilizará cuando desee indicar explícitamente el formato y el anterior (NumberFormat), cuando desee configuraciones localizadas.
Para cuatro figuras fraccionarias consistentes, no es necesario arrastrar BigDecimal, si no está trabajando con distancias realmente largas.
Otros consejos
Estoy respondiendo a mi propia pregunta por la posteridad. Utilicé la respuesta de DecimalFormat anterior, pero las respuestas no tuvieron en cuenta el tipo de retorno del método.
Aquí está el código terminado:
private double convertMetersToFeet(double meters)
{
//function converts Feet to Meters.
double toFeet = meters;
toFeet = meters*3.2808; // official conversion rate of Meters to Feet
String formattedNumber = new DecimalFormat("0.0000").format(toFeet); //return with 4 decimal places
double d = Double.valueOf(formattedNumber.trim()).doubleValue();
return d;
}
Si necesita cálculos precisos, use BigDecimal en lugar de flotar. Si solo desea truncar en la impresión, use DecimalFormat .
DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));
Use java.math.BigDecimal
para la aritmética decimal.
Si no es para imprimir, no debería preocuparse por el error. 337.36080000000004 es tan correcto como 337.3608 ya que solo tiene 5 dígitos significativos en el factor y solo 3 en la entrada de prueba. (Y ciertamente espero que la respuesta que dio su método sea 331 y no 337)
Sin embargo, esta línea obtenida de otra pregunta parece hacer el truco también.
double toFeet = ((int)(meters*3.2808*10000))/10000.0;
El único problema es que se desborda mucho más rápido.