Java实现若干个数计算平均值并保留小数位 java计算平均值 java四舍五入保留小数
一、需求
1、在项目中,要计算若干个指标的平均值,找了一圈,发现JDK中没有提供,于是乎,造一个。
2、因若干个指标不确定,这里使用可变参数来表示,易于参数传递。
3、因求取平均值后,可能会有若干位小数,需要对小数位进行处理,分别使用 java.math.BigDecimal 和 java.text.DecimalFormat 对小数位进行处理,都可以实现需求。
二、代码实现
1、以 四舍五入模式,保留若干位小数。
/**
* description: java 实现若干个数计算平均值,并 四舍五入模式,保留若干位小数。
* @param scale 保留小数的个数
* @param nums 若干个字符数字
* @return Double
* @version v1.0
* @author w
* @date 2019年10月25日 下午9:53:07
*/
public static Double average(int scale ,String ...nums) {
if(ArrayUtils.isEmpty(nums)) {
return null;
}
Double sum = 0D;
for (String num : nums) {
sum += Double.valueOf(num);
}
BigDecimal decimal = BigDecimal.valueOf(sum/nums.length).setScale(scale, RoundingMode.HALF_UP);
return decimal.doubleValue();
}
2、 小数位取舍办法,以 RoundingMode 为准。
/**
* description: java 实现若干个数计算平均值,保留若干位小数。 --- 小数位取舍办法,以 RoundingMode 为准。
* @param scale 保留小数的个数
* @param roundingMode 小数取舍的模式。 向上、向下、四舍五入 等。
* @param nums 若干个字符数字
* @return Double
* @version v1.0
* @author w
* @date 2019年10月25日 下午9:55:42
*/
public static Double average(int scale ,RoundingMode roundingMode,String ...nums) {
if(ArrayUtils.isEmpty(nums)) {
return null;
}
Double sum = 0D;
for (String num : nums) {
sum += Double.valueOf(num);
}
BigDecimal decimal = BigDecimal.valueOf(sum/nums.length).setScale(scale, roundingMode);
return decimal.doubleValue();
}
3、使用 DecimalFormat 实现数字格式化。
/**
* description: java 实现若干个数计算平均值,保留若干位小数。 --- 使用 DecimalFormat 实现数字格式化。
* @param pattern 格式化模式
* @param nums nums 若干个字符数字
* @return String
* @version v1.0
* @author w
* @date 2019年10月26日 上午9:25:44
*/
public static String average(String pattern , String ...nums) {
if(ArrayUtils.isEmpty(nums)) {
return null;
}
Double sum = 0D;
for (String num : nums) {
sum += Double.valueOf(num);
}
DecimalFormat decimalFormat = new DecimalFormat(pattern);
String format = decimalFormat.format(sum/nums.length);
return format ;
}
4、测试:
@Test
public void test() {
Double average = average(2,"2.3","2.2","3.153");
System.out.println(average);
String average2 = average("#.######" ,"2.33","2.24","3.452");
System.out.println("average2:"+ average2);
// DecimalFormat 中 "#"和"0"的区别: "#"位数不够为空,"0"位数不够,补0.
String average3 = average("#.000000" ,"2.3","2.2","3.33532");
System.out.println("average3:"+ average3);
}
5、结果如下:
2.55
average2:2.674
average3:2.611773
三、总结
1、上面任意一个方法,都可以实现若干个数计算平均值,对小数位的处理,分别使用了两个不同的类来进行处理。 还有 String.format()应该也可以实现需求。
2、ArrayUtils 类,来自于 apache commons-lang3 包 。