Doubel精度运算工具类
package com.nonstandard.system.utils;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
@Component
public class DoubleArithUtil {
private static final Integer DEF_DIV_SCALE = 2;
private static final Integer DEF_SUM_SUB_SCALE = 2;
public static Double add(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2).doubleValue();
}
public static Double add(String value1, String value2) {
BigDecimal b1 = new BigDecimal(value1);
BigDecimal b2 = new BigDecimal(value2);
return b1.add(b2).doubleValue();
}
public static Double add(Double value1, Double value2,Integer scale) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static Double add(String value1, String value2,Integer scale) {
BigDecimal b1 = new BigDecimal(value1);
BigDecimal b2 = new BigDecimal(value2);
return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double sub(Double value1, Double value2,Integer scale) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue();
}
public static double sub(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2).doubleValue();
}
public static Double mul(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2).doubleValue();
}
public static Double divide(Double dividend, Double divisor) {
return divide(dividend, divisor, DEF_DIV_SCALE);
}
public static Double divide(String dividend, String divisor) {
return divide(dividend, divisor, DEF_DIV_SCALE);
}
public static Double divide(Double dividend, Double divisor, Integer scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(dividend));
BigDecimal b2 = new BigDecimal(Double.toString(divisor));
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
}
public static Double divide(String dividend, String divisor, Integer scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(dividend);
BigDecimal b2 = new BigDecimal(divisor);
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
}
public static double round(double value,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(value));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();
}
public static double roundByScale(double value,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(value));
return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double ArithmeticMean(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){
sum+=x[i];
}
return sum/m;
}
public static double MeanSquare(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){
sum+=x[i]*x[i];
}
return Math.sqrt(sum/m);
}
public static double GeometricMean(List<Double> x){
int m=x.size();
double sum=1;
for(int i=0;i<m;i++){
sum*=x.get(i);
}
return Math.pow(sum,1.0/m);
}
public static double GeometricMean(List<Double> x,Integer scale){
int m=x.size();
double sum=1;
for(int i=0;i<m;i++){
sum*=x.get(i);
}
BigDecimal b = new BigDecimal(Double.toString(Math.pow(sum,1.0/m)));
return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double HarmonicMean(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){
sum+=1/x[i];
}
return m/sum;
}
}
;