`
beisicao
  • 浏览: 65873 次
  • 性别: 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加减乘除运算

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

    下面小编就为大家带来一篇Java中BigDecimal的基本运算(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。这篇文章主要介绍了Java BigDecimal使用指南针(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    java中BigDecimal进行加减乘除的基本用法

    大家应该对于不需要任何准确计算精度的数字可以直接使用float或double运算,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。下面这篇文章就给大家介绍介绍关于...

    Java计算器 实现最简单的加减乘除、开方、求倒数等

    Java计算器 实现最简单的加减乘除、开方、求倒数等。

    Java Math类、Random类、System类及BigDecimal类用法示例

    主要介绍了Java Math类、Random类、System类及BigDecimal类用法,结合实例形式分析了java数值运算相关的Math类、Random类、System类及BigDecimal类基本功能与使用技巧,需要的朋友可以参考下

    Java-关于基本数据类型中浮点数计算产生的精度问题

    BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,在这里我们使用BigDecimal类来解决浮点数计算产生的精度丢失问题。 精度问题 在这里我们讨论一个问题:3 – 2.7 == 0.3 的值是什么...

    廖雪峰 Java 教程.doc

    BigDecimal 常用工具类 异常处理 Java的异常 捕获异常 抛出异常 自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class类 访问字段 调用方法 调用构造...

    c++ 无符号高精度bigint

    无符号的bigint高精度大整数类,包含基本比较和运算,支持流式输入输出!

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    ARCH4系统开发指南

    2.20.4.2 用BigDecimal进行四则运算 49 2.20.4.3 舍入模式 51 2.20.4.3.1 ROUND_CEILING 51 2.20.4.3.2 ROUND_FLOOR 52 2.20.4.3.3 ROUND_DOWN 53 2.20.4.3.4 ROUND_UP 54 2.20.4.3.5 ROUND_ UNNECESSARY 55 2.20....

    EvalEx:EvalEx是Java的便捷表达式评估器,可以评估简单的数学和布尔表达式

    使用BigDecimal进行计算和结果 不依赖外部库 可以设置精度和舍入模式 支持变量 标准布尔和数学运算符 标准基本数学和布尔函数 可以在运行时添加自定义函数和运算符 可以使用可变数量的参数定义函数(请参见MIN和MAX...

    java编程基础,应用与实例

    3.6.3 String型对象与基本数据类型间的运算 25 3.7 运算符 25 3.7.1 逻辑非(!) 26 3.7.2 位非运算符(~) 26 3.7.3 符号运算符(+、-) 27 3.7.4 增减运算符(++、--) 27 3.7.5 算术运算符(+、-、*、/) 29...

Global site tag (gtag.js) - Google Analytics