Java Gleitkomma-Mathematik - (Umwandlung für Fuß / m)
-
03-07-2019 - |
Frage
Pretty grundlegende Frage denke ich - ich bin diese Funktion ausführen:
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;
}
Das Problem ist der Ausgang; zum Beispiel bekomme ich 337,36080000000004 von einem Eingang 101. Was ist die entsprechende Praxis der schwimmenden Punkte für Kürzen?
Wie die untengenannten Antworten angenommen, ich würde will 4 signifikante Zahlen konsistent bleiben mit meinem Umwandlungsverhältnis.
Lösung
Sie können mit einem Number Instanz.
NumberFormat nf = NumberFormat.getInstance(Locale.UK);
nf.setMinimumFractionDigits(4);
nf.setMaximumFractionDigits(4);
System.out.println(nf.format(feet));
Oder Sie benutzen DecimalFormat .
DecimalFormat df = new DecimalFormat("0.0000");
System.out.println(df.format(feet));
Die letztere (DecimalFormat), verwendet werden soll, wenn Sie explizit das Format und den ehemaligen (Number) angeben möchten, wenn lokalisierte Einstellungen möchten.
Für vier konsistente gebrochene Zahlen, gibt es keine Notwendigkeit, in BigDecimal zu ziehen, wenn Ihr nicht mit wirklich lange Strecken zu arbeiten.
Andere Tipps
Ich beantworte meine eigene Frage für die Nachwelt willen. Früher habe ich die DecimalFormat oben beantworten, aber die Antworten ausgefallen berücksichtigen den Rückgabetyp der Methode.
Hier ist der fertige Code:
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;
}
Wenn Sie genaue Berechnungen benötigen, verwenden Sie BigDecimal anstelle von float. Wenn Sie nur auf Druck kürzen, verwenden Sie DecimalFormat .
DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));
Mit java.math.BigDecimal
für Dezimalarithmetik.
Wenn es nicht für das Drucken Sie ist, sollten Sie den Fehler nicht. 337,36080000000004 ist ebenso richtig wie 337,3608, da Sie nur 5 signifikante Stellen in dem Faktor haben und nur drei in dem Testeingang. (Und ich hoffe natürlich, dass die Antwort Ihre Methode gab, war 331 und nicht 337)
Allerdings ist diese Linie geholt von einer anderen Frage scheint den Trick zu tun als auch.
double toFeet = ((int)(meters*3.2808*10000))/10000.0;
Das einzige Problem ist, dass viel schneller ist überläuft.