求某大公司机试题解答

哆啦A梦_ 发布于 2013/08/27 13:32
阅读 777
收藏 2

应聘某公司,参加机试,题目大概意思如下,写一个函数,参数是一个int数组,要求函数返回数组的平均值的字符串,取小数点后面3位,不要四舍五入,不足用0不足。java语言

如传入int[] a = {0,1,2,2,5}; 应该返回:2.000

我的回答提交后,测试用例测试结果好几个结果不对,忘高手解惑,附我的回答如下:


public String testavg(int[] a)
{
    if(a.length > 0)
    {
        double sum=0.0;
        for(int i=0;i<a.lengthh;i++)
        {
            sum +=a[i];
        }
        DecimalFormat df = new DecimalFormat("0.0000");
        return df.format(sum/a.length).substring(0,5);
    }else{return "0.000";
    }
}



加载中
0
moyiguke
moyiguke

可以直接用 BigDecimal 不?

int[] a = {1,2,3,9,19};
		BigDecimal sum = new BigDecimal("0");
		for(int i = 0 ; i<a.length ; i++ ){
			BigDecimal  tmp = new BigDecimal(String.valueOf(a[i]));
			sum = sum.add(tmp);
		}
		BigDecimal ave = sum.divide(new BigDecimal(String.valueOf(a.length)));
		System.out.println(ave);
用bigdecimal计算保证计算结果的正确性。保留有效位数的话,用format

moyiguke
moyiguke
回复 @尒牛 : 嘻嘻,不客气
哆啦A梦_
哆啦A梦_
我感觉用BigDecimal应该就可以了,谢谢
0
伊藤熊吉
伊藤熊吉
public class Avgs {

	public static String testavg(int[] a) {
		if (a.length > 0) {
			float sum = 0.000f;
			for (int i = 0; i < a.length; i++) {
				sum += new Float(new Double(a[i]));
			}
			DecimalFormat df = new DecimalFormat("0.0000");
			return df.format(sum / a.length).toString();
		} else {
			return "0.000";
		}
	}

	public static void main(String[] args) {
		int[] a = new int[5];
		//0,1,2,2,5
		a[0] = 0;
		a[1] = 1;
		a[2] = 2;
		a[3] = 2;
		a[4] = 5;
		System.out.println(Avgs.testavg(a));
	}

}
返回结果是2.000 你试试?
0
Beyond-Bit
Beyond-Bit

return df.format(sum/a.length).substring(0,5);???为神马要截取??


DecimalFormat本来就有这种格式的,你是缺少设置参数、好好看看jdk,加上下面这个就ok了


DecimalFormat format=new DecimalFormat("0.0000");
format.setMaximumFractionDigits(3);
format.setGroupingSize(0);
format.setRoundingMode(RoundingMode.FLOOR);
Beyond-Bit
Beyond-Bit
回复 @尒牛 : 不能截取的!jdk已经带有处理这种问题的函数了,安全无毒,绿色环保:
哆啦A梦_
哆啦A梦_
不要四舍五入的,format出来的最后一位是四舍五入的,所以我考虑多取一位,然后截掉最后那位,返回的结果不四舍五入
0
火蚁
火蚁
你如果要截取的话,用小数点来判断截取就行了:
            // 1.格式化为4位
            DecimalFormat df = new DecimalFormat("0.0000");
            String res = df.format(sum/a.length);
            // 2.截取
            return res.substring(0,res.indexOf(".")+4);
0
duty
duty
我以为是司机的面试题。。
0
火蚁
火蚁

引用来自“LittleDY”的答案

你如果要截取的话,用小数点来判断截取就行了:
            // 1.格式化为4位
            DecimalFormat df = new DecimalFormat("0.0000");
            String res = df.format(sum/a.length);
            // 2.截取
            return res.substring(0,res.indexOf(".")+4);
res.indexOf(".")表示小数点第一次出现时的索引值,在加上4就是三位小数了
哆啦A梦_
哆啦A梦_
对的,应该根据小数点截取
0
顺其自然001
顺其自然001
public String testavg(int[] a) {
    if (a.length > 0) {
      double sum = 0.0;
      for (int i = 0; i < a.length; i++) {
        sum += a[i];
      }
      DecimalFormat df = new DecimalFormat("#0.000");
      return df.format(sum / a.length);
    } else {
      return "0.000";
    }
  }
0
哆啦A梦_
哆啦A梦_
测试用例结果有些正确,有些我的函数运算出来结果都是3.000,2.000之类的,标准答案是3.245,2.123之类的,回来没想明白哪里出问题了,忘高手解惑
哆啦A梦_
哆啦A梦_
回复 @伊藤熊吉 : 我有测试用例,可以自己调试看出问题出在哪里了
伊藤熊吉
伊藤熊吉
你再给点测试用例,我试试
0
Beyond-Bit
Beyond-Bit

引用来自“Beyond-Bit”的答案

return df.format(sum/a.length).substring(0,5);???为神马要截取??


DecimalFormat本来就有这种格式的,你是缺少设置参数、好好看看jdk,加上下面这个就ok了


DecimalFormat format=new DecimalFormat("0.0000");
format.setMaximumFractionDigits(3);
format.setGroupingSize(0);
format.setRoundingMode(RoundingMode.FLOOR);

楼主啊,你是无视我给你的jdk函数处理方法嘛?设置好参数即可

DecimalFormat format=new DecimalFormat("0.0000"); 
format.setMaximumFractionDigits(3); 
format.setGroupingSize(0); 
format.setRoundingMode(RoundingMode.FLOOR); 

哆啦A梦_
哆啦A梦_
没无视,看到啦
0
guquanjiang
guquanjiang
public static String testavg(int[] a) {
if (a.length > 0) {
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}

Double double1 = sum / a.length;
System.out.println("--------"+double1+"---------");
return String.format("%.3f", double1);
} else {
return "0.000";
}
}


这个可以!

返回顶部
顶部