2013-10-27 53 views
0

我正在編寫一個程序來獲得兩個數字的平均值。對於測試用例,2, 4的輸出應該是3而不是3.0。對於測試用例,-1282660896, -672813783 輸出應該是-977737339.5而不是-9.777373395E8從雙精度除去小數點後的尾部零點

我的代碼是這樣的:

public static void getAve(long a, long b){ 
    System.out.println((double)(a + b)/2); 
} 

我還創建了一個格式化功能,以滿足我的需要,像這樣:

public static String fmt(double d) { 
     if (d == (long) d) 
      return String.format("%d", (long) d); 
     else 
      return String.format("%s", d); 
    } 

但是這也失敗了測試用例2

+3

您需要一種不切換到科學記數法的格式。 (d)' –

+0

@PeterLawrey謝謝你的解決方案工作:) – Jaguar

+0

你可以保留DecimalFormat對象作爲一個常量來提高性能。 –

回答

0

對於情況2,您要使用不使用科學記數法,並指定精度格式:

return String.format("%.1f", d); // only one digit fractional precision 

請參閱http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

此外,比較double與int是危險的,因爲double不能保證表示恰好是一個整數。你最好檢查它是否接近一個預定義epsilon的整數。