Question

Jolie question de base, je pense - je remplis cette fonction:

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

Le problème est la sortie; par exemple, je reçois 337.36080000000004 à partir d’une entrée de 101. Quelle est la pratique appropriée pour tronquer les points flottants?

Comme supposé les réponses ci-dessous, je voudrais que 4 chiffres significatifs restent cohérents avec mon taux de conversion.

Était-ce utile?

La solution

Vous pouvez utiliser un NumberFormat instance.

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

Vous pouvez également utiliser DecimalFormat .

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

Ce dernier (DecimalFormat) doit être utilisé lorsque vous souhaitez explicitement définir le format et l'ancien (NumberFormat) lorsque vous souhaitez définir des paramètres localisés.

Pour quatre chiffres fractionnaires cohérents, il n’est pas nécessaire de faire glisser BigDecimal si vous ne travaillez pas avec de très longues distances.

Autres conseils

Je réponds à ma propre question pour la postérité. J'ai utilisé la réponse DecimalFormat ci-dessus, mais les réponses n'ont pas réussi à prendre en compte le type de retour de la méthode.

Voici le code fini:

  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 vous avez besoin de calculs précis, utilisez BigDecimal au lieu de float. Si vous souhaitez simplement tronquer à l'impression, utilisez DecimalFormat .

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

Utilisez java.math.BigDecimal pour l'arithmétique décimale.

Si ce n’est pas pour l’impression, vous ne devez pas vous soucier de l’erreur. 337.36080000000004 est aussi correct que 337.3608 puisque vous n'avez que 5 chiffres significatifs dans le facteur et seulement 3 dans l'entrée de test. (Et j'espère certainement que la réponse fournie par votre méthode a été 331 et non 337)

Cependant, cette ligne extraite d'une autre question semble faire l'affaire. aussi bien.

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

Le seul problème est que les débordements sont beaucoup plus rapides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top