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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top