`
beisicao
  • 浏览: 66586 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

BigDecimal的基本运算

阅读更多
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基本运算介绍

    `BigDecimal` 的运算方式与基本数据类型有所不同,因为它涉及到的对象操作而非简单的数值计算。 ### 1. 创建 `BigDecimal` 对象 `BigDecimal` 构造器通常接收一个字符串参数,该字符串表示要转换为 `BigDecimal` ...

    Java中BigDecimal的基本运算(详解)

    Java中BigDecimal的基本运算详解 Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 ...

    Java BigDecimal使用及基本运算(推荐)

    对于 BigDecimal 的基本运算,包括加法、减法、乘法和除法,我们不能像操作普通数字那样直接使用 +、-、*、/ 运算符,而是需要调用对应的方法: 1. **加法**:使用 `add()` 方法 ```java BigDecimal number3 = ...

    BigDecimal工具类.docx

    BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...

    javascript版BigDecimal类库

    2. **算术操作**:提供加法(`add`)、减法(`subtract`)、乘法(`multiply`)、除法(`divide`)等基本算术运算,这些操作能确保结果的精度不受JavaScript Number类型的限制。 3. **比较操作**:支持小于(`lt`)...

    BigDecimal加减乘除计算

    BigDecimal 提供了加法(add())、减法(subtract())、乘法(multiply())和除法(divide())等基本运算,以及求绝对值(abs())等方法。 1. 初始化 BigDecimal 对象: 初始化 BigDecimal 时,推荐使用字符串参数...

    java BigDecimal操作

    其次,BigDecimal支持基本的算术运算,如加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`)和除法(`divide()`). 分割除法时需注意,由于可能会出现无限循环小数,`divide()`方法需要指定舍入模式,例如`...

    bigdecimal

    本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### 一、基本概念 `BigDecimal` 类提供了一种可以进行任意精度定点数算术的方法。这意味着它可以存储一个数值的任意小数...

    BigDecimal向Double转换

    然而,在某些情况下,我们可能需要将BigDecimal类型的值转换为Double类型,比如为了与一些只接受基本数据类型或其包装类的方法参数兼容,或者进行一些基于Double的数学运算等。本文将详细介绍如何在Java中实现...

    java中BigDecimal的操作方法

    1. **性能**:BigDecimal的运算速度比基本类型慢,因为它需要进行更复杂的计算。 2. **内存消耗**:每个BigDecimal对象都包含其完整的数值,所以大量使用可能导致内存占用增加。 3. **舍入策略**:选择合适的舍入...

    MyEditTextApplication输入框BigDecimal计算价格

    6. **性能优化**:由于BigDecimal运算相对于基本类型来说较慢,因此在处理大量数据或者频繁计算时,要注意优化代码,避免不必要的计算和内存开销。 7. **UI更新**:在更新EditText中的显示时,应该在UI线程进行,...

    BigDecimal计算

    2. **基本运算**:`BigDecimal`支持加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`)和除法(`divide()`). 这些方法返回新的`BigDecimal`对象,保持原有的精度。 3. **舍入模式**:在进行除法运算时,可能会...

    使用BigDecimal进行精确运算(实现加减乘除运算)

    BigDecimal是Java中用于进行高精度、精确浮点数运算的类,它解决了浮点数在二进制表示下无法精确表示所有十进制数的问题。在计算机科学中,由于浮点数(如float和double)是以二进制小数的形式存储,某些十进制数值...

    java-BigInteger-BigDecimal类源码

    它可以执行所有的基本算术运算(加、减、乘、除、模)以及高级运算,如位操作和质数测试。 2. **内存管理**:由于`BigInteger`对象可以表示非常大的数字,它们通常占用大量内存。因此,在处理大整数时需要注意性能...

    【Java】BigDecimal实现加减乘除运算代码

    在实际应用中,`BigDecimal`不仅可以用于基本的数学运算,还可以用于金融、财务等需要精确计算的场景。其灵活性和可配置性使得我们可以根据需求调整精度和舍入策略,避免了由于浮点数运算导致的不准确性。在处理大数...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    - 在进行`BigDecimal`运算时,应避免直接使用操作符`+`、`-`、`*`、`/`,因为它们会导致基本类型的浮点数运算,从而失去精度控制。应该使用对应的`add()`、`subtract()`、`multiply()`、`divide()`方法。 - `...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    ### `BigDecimal`的基本操作 1. **加法**:通过调用`add()`方法完成两个`BigDecimal`对象的相加。例如: ```java BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5"); ...

    Java中使用BigDecimal进行精确运算

    3. **转换回基本类型**:如果需要将BigDecimal的结果转换回float、double或整型,可以使用`floatValue()`、`doubleValue()`或`intValue()`等方法。 ```java double sum = result.doubleValue(); ``` 为了方便使用...

    运用BigDecimal精确计算

    在上述代码中,我们演示了`BigDecimal`的基本用法,包括加减乘除运算以及设置精度和舍入模式。通过这样的方式,我们可以确保在计算过程中不会因为浮点数的精度问题而产生错误的结果。在实际项目中,结合`Arith.java`...

    BigDecimal详解、代码示例和经常遇到的坑

    #### 三、基本运算方法 - **加法**:`add(BigDecimal val)` - **减法**:`subtract(BigDecimal val)` - **乘法**:`multiply(BigDecimal val)` - **除法**:`divide(BigDecimal val, int scale, RoundingMode ...

Global site tag (gtag.js) - Google Analytics