Calcul en virgule flottante Java - (conversion en pieds / mètres)
-
03-07-2019 - |
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.
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.