簡體   English   中英

Java 浮點數學 - (轉換為英尺/米)

[英]Java floating point math - (conversion for feet/meters)

我認為非常基本的問題 - 我正在執行這個 function:

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

問題是 output; 例如,我從 101 的輸入中得到 337.36080000000004。截斷浮點數的適當做法是什么?

正如下面的答案所假設的,我希望 4 個有效數字與我的轉化率保持一致。

您可以使用NumberFormat實例。

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

或者您可以使用DecimalFormat

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

后者(DecimalFormat)是在您明確想要 state 格式時使用,而前者(NumberFormat)是在想要本地化設置時使用。

對於四個一致的小數,如果您不是在很長的距離上工作,則無需拖入 BigDecimal。

為了后代,我正在回答我自己的問題。 我使用了上面的 DecimalFormat 答案,但答案沒有考慮到方法的返回類型。

這是完成的代碼:

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

如果您需要精確計算,請使用BigDecimal而不是 float。 如果您只想在打印時截斷,請使用DecimalFormat

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

使用java.math.BigDecimal進行十進制運算。

如果它不是用於打印,您不應該關心錯誤。 337.36080000000004 與 337.3608 一樣正確,因為因子中只有 5 個有效數字,而測試輸入中只有 3 個有效數字。 (我當然希望你的方法給出的答案是 331 而不是 337)

但是,從另一個問題中提取的這條線似乎也可以解決問題。

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

唯一的問題是溢出速度更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM