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));
}
}
分享到:
相关推荐
`BigDecimal` 的运算方式与基本数据类型有所不同,因为它涉及到的对象操作而非简单的数值计算。 ### 1. 创建 `BigDecimal` 对象 `BigDecimal` 构造器通常接收一个字符串参数,该字符串表示要转换为 `BigDecimal` ...
Java中BigDecimal的基本运算详解 Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 ...
对于 BigDecimal 的基本运算,包括加法、减法、乘法和除法,我们不能像操作普通数字那样直接使用 +、-、*、/ 运算符,而是需要调用对应的方法: 1. **加法**:使用 `add()` 方法 ```java BigDecimal number3 = ...
BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...
2. **算术操作**:提供加法(`add`)、减法(`subtract`)、乘法(`multiply`)、除法(`divide`)等基本算术运算,这些操作能确保结果的精度不受JavaScript Number类型的限制。 3. **比较操作**:支持小于(`lt`)...
BigDecimal 提供了加法(add())、减法(subtract())、乘法(multiply())和除法(divide())等基本运算,以及求绝对值(abs())等方法。 1. 初始化 BigDecimal 对象: 初始化 BigDecimal 时,推荐使用字符串参数...
其次,BigDecimal支持基本的算术运算,如加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`)和除法(`divide()`). 分割除法时需注意,由于可能会出现无限循环小数,`divide()`方法需要指定舍入模式,例如`...
本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### 一、基本概念 `BigDecimal` 类提供了一种可以进行任意精度定点数算术的方法。这意味着它可以存储一个数值的任意小数...
然而,在某些情况下,我们可能需要将BigDecimal类型的值转换为Double类型,比如为了与一些只接受基本数据类型或其包装类的方法参数兼容,或者进行一些基于Double的数学运算等。本文将详细介绍如何在Java中实现...
1. **性能**:BigDecimal的运算速度比基本类型慢,因为它需要进行更复杂的计算。 2. **内存消耗**:每个BigDecimal对象都包含其完整的数值,所以大量使用可能导致内存占用增加。 3. **舍入策略**:选择合适的舍入...
6. **性能优化**:由于BigDecimal运算相对于基本类型来说较慢,因此在处理大量数据或者频繁计算时,要注意优化代码,避免不必要的计算和内存开销。 7. **UI更新**:在更新EditText中的显示时,应该在UI线程进行,...
2. **基本运算**:`BigDecimal`支持加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`)和除法(`divide()`). 这些方法返回新的`BigDecimal`对象,保持原有的精度。 3. **舍入模式**:在进行除法运算时,可能会...
BigDecimal是Java中用于进行高精度、精确浮点数运算的类,它解决了浮点数在二进制表示下无法精确表示所有十进制数的问题。在计算机科学中,由于浮点数(如float和double)是以二进制小数的形式存储,某些十进制数值...
它可以执行所有的基本算术运算(加、减、乘、除、模)以及高级运算,如位操作和质数测试。 2. **内存管理**:由于`BigInteger`对象可以表示非常大的数字,它们通常占用大量内存。因此,在处理大整数时需要注意性能...
在实际应用中,`BigDecimal`不仅可以用于基本的数学运算,还可以用于金融、财务等需要精确计算的场景。其灵活性和可配置性使得我们可以根据需求调整精度和舍入策略,避免了由于浮点数运算导致的不准确性。在处理大数...
- 在进行`BigDecimal`运算时,应避免直接使用操作符`+`、`-`、`*`、`/`,因为它们会导致基本类型的浮点数运算,从而失去精度控制。应该使用对应的`add()`、`subtract()`、`multiply()`、`divide()`方法。 - `...
### `BigDecimal`的基本操作 1. **加法**:通过调用`add()`方法完成两个`BigDecimal`对象的相加。例如: ```java BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5"); ...
3. **转换回基本类型**:如果需要将BigDecimal的结果转换回float、double或整型,可以使用`floatValue()`、`doubleValue()`或`intValue()`等方法。 ```java double sum = result.doubleValue(); ``` 为了方便使用...
在上述代码中,我们演示了`BigDecimal`的基本用法,包括加减乘除运算以及设置精度和舍入模式。通过这样的方式,我们可以确保在计算过程中不会因为浮点数的精度问题而产生错误的结果。在实际项目中,结合`Arith.java`...
#### 三、基本运算方法 - **加法**:`add(BigDecimal val)` - **减法**:`subtract(BigDecimal val)` - **乘法**:`multiply(BigDecimal val)` - **除法**:`divide(BigDecimal val, int scale, RoundingMode ...