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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top