Domanda

Domanda piuttosto basilare, penso: sto eseguendo questa funzione:

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;
}

Il problema è l'output; per esempio ottengo 337.36080000000004 da un input di 101. Qual è la pratica appropriata per troncare i punti mobili?

Come ipotizzato dalle risposte di seguito, vorrei che 4 cifre significative fossero coerenti con il mio rapporto di conversione.

È stato utile?

Soluzione

Puoi utilizzare un NumberFormat istanza.

NumberFormat nf = NumberFormat.getInstance(Locale.UK);
nf.setMinimumFractionDigits(4);
nf.setMaximumFractionDigits(4);
System.out.println(nf.format(feet));

Oppure puoi usare DecimalFormat .

DecimalFormat df = new DecimalFormat("0.0000");
System.out.println(df.format(feet));

Quest'ultimo (DecimalFormat), deve essere usato quando si desidera esplicitamente dichiarare il formato e il primo (NumberFormat), quando si vogliono impostazioni localizzate.

Per quattro cifre frazionarie coerenti, non è necessario trascinare in BigDecimal, se non si lavora su lunghe distanze.

Altri suggerimenti

Sto rispondendo alla mia domanda per l'amor dei posteri. Ho usato la risposta DecimalFormat sopra, ma le risposte non sono state in grado di tenere conto del tipo restituito del metodo.

Ecco il codice finito:

  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;
}

Se hai bisogno di calcoli precisi, usa BigDecimal invece di float. Se vuoi solo troncare sulla stampa, usa DecimalFormat .

DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));

Usa java.math.BigDecimal per l'aritmetica decimale.

Se non è per la stampa, non dovresti preoccuparti dell'errore. 337.36080000000004 è corretto quanto 337.3608 poiché hai solo 5 cifre significative nel fattore e solo 3 nell'input del test. (E spero sicuramente che la risposta fornita dal metodo sia 331 e non 337)

Tuttavia, questa riga recuperata da un'altra domanda sembra fare il trucco anche.

double toFeet = ((int)(meters*3.2808*10000))/10000.0;

L'unico problema è che trabocca molto più velocemente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top