2013-10-27 52 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的整数。