方差的计算,如果不太计较精度的话,可以使用 Apache 的 commons-math3(http://commons.apache.org/proper/commons-math/)提供的 Variance 类。不过毕竟 Variance 是使用 double 进行计算,会有精度损失,所以自己写了个计算方差的工具类,采用 BigDecimal 进行计算,并且可以自己指定精度值,代码如下:

该工具类是使用最基本的方差计算公式进行计算的,如果要使用流式方式计算方差,可以参考以下文章:

https://zhuanlan.zhihu.com/p/48025855

​package com.frank.test.variance;import java.math.BigDecimal;import com.google.common.base.Preconditions;/*** 方差计算工具类。* * @author frank*/
public final class VarianceUtils {/*** 默认精度*/private static final int DEFAULT_SCALE = 64;private VarianceUtils() {}public static BigDecimal variance(byte[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(byte[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}public static BigDecimal variance(char[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(char[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}public static BigDecimal variance(int[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(int[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}public static BigDecimal variance(long[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(long[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}public static BigDecimal variance(float[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(float[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}public static BigDecimal variance(double[] arr) {Preconditions.checkNotNull(arr);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr);}public static BigDecimal variance(double[] arr, int scale) {Preconditions.checkNotNull(arr);Preconditions.checkArgument(scale > 0, "scale must be positive: " + scale);String[] strArr = new String[arr.length];for (int i = 0; i < arr.length; i++) {strArr[i] = String.valueOf(arr[i]);}return variance(strArr, scale);}private static BigDecimal variance(String[] arr) {return variance(arr, DEFAULT_SCALE);}private static BigDecimal variance(String[] arr, int scale) {if (arr.length < 2) {return BigDecimal.ZERO;}BigDecimal sum = BigDecimal.ZERO;for (int i = 0; i < arr.length; i++) {sum = sum.add(new BigDecimal(arr[i]));}BigDecimal meanNum = sum.divide(new BigDecimal(arr.length), scale, BigDecimal.ROUND_HALF_DOWN);BigDecimal tmp = null;BigDecimal tmpSum = BigDecimal.ZERO;for (int i = 0; i < arr.length; i++) {tmp = meanNum.subtract(new BigDecimal(arr[i]));tmpSum = tmpSum.add(tmp.multiply(tmp));}BigDecimal vari = tmpSum.divide(new BigDecimal(arr.length), scale, BigDecimal.ROUND_HALF_DOWN);return new BigDecimal(trimZero(vari.toString()));}/*** 去除小数中后面多余的0* * @param str* @return*/private static String trimZero(String str) {if (!str.contains(".")) {return str;}StringBuilder ret = new StringBuilder();char[] chars = str.toCharArray();// stop trimming 0boolean stopTrim = false;for (int i = chars.length - 1; i >= 0; i--) {char ch = chars[i];if (stopTrim) {ret.append(ch);continue;}// not stop trimming 0if (ch != '0') {ret.append(ch);stopTrim = true;}}if (ret.charAt(0) == '.') {ret.deleteCharAt(0);}return ret.reverse().toString();}
}​

方差计算工具类--Java版相关推荐

  1. 腾讯开放平台接口鉴权(计算签名)工具类 java版

    腾讯开放平台 接口鉴权(签名)工具类 java版 用到了Hutool工具类 package top.seasmall.platform.core.config.nettyws.util;import ...

  2. 贷款计算器- 等额本金、等额本息工具类(Java版)

    /** * Description:等额本金工具类 * Copyright: Copyright (Corporation)2015 * Company: Corporation * @version ...

  3. 等额本金、等额本息工具类(Java版)

    等额本息: /** * Description:等额本息工具类 * Copyright: Copyright (corporation)2015 * Company: Corporation * @a ...

  4. 坐标系转换工具类Java版Js版

    Java版本: public class GPSUtils {private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;// ...

  5. MD5工具类(java实现版)

    MD5工具类(java实现版) 介绍 MD5(Message Digest Algorithm)加密算法是不对称的加密算法,因为其实不可逆的,实际上其不能算作加密算法, 因为其不可解密.其实现原理是基 ...

  6. java jexl 工具类_jexl表达式解析、计算工具类.md

    jexl表达式解析.计算工具类.md 根据表达式可以动态反向解析出变量:适合动态表达式,参数未知场景 如 (A0.2+B0.8)/C 解析出 A\B\C,把ABC参数值代入计算 初始化引擎 priva ...

  7. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

  8. Java 时间间隔计算工具类

    Java 时间间隔计算工具类 一.工具类-DateIntervalUtil package com.example.demotest.util;import java.text.DecimalForm ...

  9. 计算车号Java,java停车收费计算工具类

    停车收费计算工具类.收费标准:8时至22时,停车1小时内3元,超过1小时每延长1小时加收3元:11时至12时.16时30分至17时30分,停车30分钟内收1元,超过30分收3元:晚22时至次日8时,收 ...

最新文章

  1. Exchange2007 中Send as 与Send on behalf of 讲解
  2. RSAC简介 RSAC 2020 最热门的36款网络安全产品
  3. git 如何正确的提交文件
  4. Spring Cloud构建微服务架构(七)消息总线(续:Kafka)
  5. c++全局监听ctrl s_号称史上最全!134个CAD快捷键强烈来袭,难道你只知道Ctrl+C?...
  6. bat 存储过程返回值_MySQL-存储过程和函数详述
  7. 服务器路径和本地路径在使用cd时候的区别
  8. Java中引入泛型的好处
  9. IDEA Properties 文件乱码
  10. input单选框多选框时可用的事件
  11. [渝粤教育] 中国地质大学 结构力学 复习题 (2)
  12. ubuntu第三方源导致软件无法安装的问题
  13. 【python实战】top4 华氏度与摄氏度互转
  14. 公众号关键字自动回复内容点击跳转小程序方法
  15. UI设计中面性图标设计总结
  16. 韩老师讲SQL2005数据库开发 环境准备代码
  17. 2021-下载酷狗音乐-爬虫-java
  18. 如何科学有效地根治肾虚——中篇(肾虚到底是什么?)
  19. Tensorflow slim库
  20. 《解忧杂货店》读后感

热门文章

  1. linux更改桌面壁纸的脚本,使用 LSWC 在 Linux 中自动更改壁纸
  2. html自定义单选按钮,美化表单——自定义单选按钮和复选按钮
  3. AR开发 - 入门笔记
  4. 联通ADSL改小区宽带
  5. parquet--golang使用
  6. 大亚DB102-C用户不可错过的美篇——不断流的DB102-C(白色版)
  7. 广东公办职高计算机网络技术,广州市有哪些公办中专学校 公办中职学校名录?...
  8. 计算机操作技能竞赛系列方案,2018年第十届学生技能展示计算机专业活动方案...
  9. 初步对SSM框架中Dao层,Mapper层,service等层的理解
  10. mini2440移植linux内核,mini2440的 linux内核移植