[英]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.