import java.math.BigDecimal;
public class Arith {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
// 这个类不能实例化
private Arith(){}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 减数
* @param v2 被减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
. * 提供精确的乘法运算。
. * @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后 10 位,以后的数字四舍五入。
* @param v1 除数
* @param v2 被除数
* @return 两个参数的商
*/
public static double div(double v1,double v2)
{
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由 scale 参数指
* 定精度,以后的数字四舍五入。
* @param v1 除数
* @param v2 被除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale)
{
if (scale<0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale)
{
if (scale<0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 求给定双精度数组中值的最大值
* @param inputData 输入数据数组
* @return 运算结果,如果输入值不合法,返回为-1
*/
public static double getMax(double[] inputData) {
if (inputData == null || inputData.length == 0)
return -1;
int len = inputData.length;
double max = inputData[0];
for (int i = 0; i < len; i++) {
if (max < inputData[i])
max = inputData[i];
}
return max;
}
/**
* 求求给定双精度数组中值的最小值
* @param inputData 输入数据数组
* @return 运算结果,如果输入值不合法,返回为-1
*/
public static double getMin(double[] inputData) {
if (inputData == null || inputData.length == 0)
return -1;
int len = inputData.length;
double min = inputData[0];
for (int i = 0; i < len; i++) {
if (min > inputData[i])
min = inputData[i];
}
return min;
}
/**
* 求给定双精度数组中值的和
* @param inputData 输入数据数组
* @return 运算结果
*/
public static double getSum(double[] inputData) {
if (inputData == null || inputData.length == 0)
return -1;
int len = inputData.length;
double sum = 0;
for (int i = 0; i < len; i++) {
sum = Arith.add(sum, inputData[i]);
}
return sum;
}
/**
* 求给定双精度数组中值的数目
* @param input Data 输入数据数组
* @return 运算结果
*/
public static int getCount(double[] inputData) {
if (inputData == null)
return -1;
return inputData.length;
}
/**
* 求给定双精度数组中值的平均值
* @param inputData 输入数据数组
* @return 运算结果
*/
public static double getAverage(double[] inputData) {
if (inputData == null || inputData.length == 0)
return -1;
int len = inputData.length;
double result;
result = Arith.div(getSum(inputData),len, 3);
return result;
}
/**
* 求给定双精度数组中值的平方和
* @param inputData 输入数据数组
* @return 运算结果
*/
public static double getSquareSum(double[] inputData) {
if(inputData==null||inputData.length==0)
return -1;
int len=inputData.length;
double sqrsum = 0.0;
for (int i = 0; i <len; i++) {
sqrsum = Arith.add(sqrsum, Arith.mul(inputData[i], inputData[i]));
}
return sqrsum;
}
/**
* 求给定双精度数组中值的方差
* @param inputData 输入数据数组
* @return 运算结果
*/
public static double getVariance(double[] inputData) {
int count = getCount(inputData);
double sqrsum = getSquareSum(inputData);
double average = getAverage(inputData);
double result;
result = Arith.div(Arith.sub(sqrsum, Arith.mul(count, Arith.mul(average, average))), count, 5);
return result;
}
/**
* 求给定双精度数组中值的标准差
*
* @param inputData 输入数据数组
* @param scale 保留小数点位数
* @return 运算结果
*/
public static double getStandardDiviation(double[] inputData,int scale) {
double result;
//绝对值化很重要
result = Math.sqrt(Math.abs(getVariance(inputData)));
result = Arith.round(result, scale);
return result;
}
public static void main(String[] args){
double [] testData=new double[]{1,2,3,4,5,6,7,8,10};
System.out.println(Arith.getStandardDiviation(testData,3));
}
}
分享到:
相关推荐
import java.math.BigDecimal; import java.util.regex.Pattern; import com.android.xiong.gridlayoutTest.R.id; import android.os.Bundle; import android.app.Activity; import android.view.Menu; ...
import java.math.BigDecimal; public class HelloWorld { public static void main(String[] args) { BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.1"); BigDecimal c = a....
import java.math.BigDecimal; public class CommodityBean { private int id; // 产品 id private int class_id; // 分类 id private String title; // 名称 private BigDecimal price; // 价格 private ...
import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import javax.faces.context.FacesContext; import javax.faces.event....
import java.math.BigDecimal; import java.text.DecimalFormat; public class Calculation { public static final DecimalFormat df = new DecimalFormat("######0.00"); /** * @methodName format2point * @...
import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Lottery { private List<LotteryProp> participants; public Lottery(List...
import java.math.BigDecimal; double num = 3.14159; BigDecimal bd = new BigDecimal(String.valueOf(num)); bd = bd.setScale(2, RoundingMode.HALF_UP); String formattedNum = bd.toPlainString(); ...
[已弃用] 适用于 Java 的 Xsolla SDK 用于与交互的官方 SDK 要求 JDK 1.7 Maven 3 安装 添加到您的 pom.xml: ... <artifactId>sdk <version>1.0.1 ...import java.math.BigDecimal; import java.
创建`BigDecimal`对象通常有两种方式,一是通过`new BigDecimal(String)`构造器,二是通过`BigDecimal.valueOf(double)`方法。前者接受一个字符串,后者接受一个double值。但需要注意的是,从`double`转换成`...
double value = Double.parseDouble(bigDecimal.toString()); System.out.println("Safe Converted Value: " + value); } } ``` 通过这种方式,即使BigDecimal中的值非常大或具有很多小数位,也可以准确无误地...
import java.math.BigDecimal; public class FormatDemo { public static void main(String[] args) { double x = 23.5455; NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits...
import java.math.BigDecimal; public class BigDecimalSerialize extends JsonSerializer<BigDecimal> { @Override public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider ...
import java.math.BigDecimal; public class Arith { // 默认精度 private static final int DEF_DIV_SCALE = 10; // 私有构造函数,防止实例化 private Arith() {} /** * 提供精确的加法计算。 * @param ...
import java.math.BigDecimal; public class Change { public static void main(String[] args) { BigDecimal amountPaid = new BigDecimal("2.00"); BigDecimal itemCost = new BigDecimal("1.10"); ...
import java.math.BigDecimal; public class Test { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("0.005"); BigDecimal num2 = new BigDecimal("1000000"); // 加法 ...
import java.math.BigDecimal; public class Test { public static void main(String[] args) { double i = 3.856; System.out.println("四舍五入(3.856)=" + new BigDecimal(i).setScale(0, BigDecimal.ROUND_...
import java.math.BigDecimal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.JdbcTemplate; import ...
import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest;...