BigDecimal进行精确运算demo工具类

package com.js.ai.modules.pointwall.interfac;

import java.math.BigDecimal;

public class TestDigDecimal {
	//默认除法运算精度
	private static final int DEF_DIV_SCALE = 10;

	/**
	* 提供精确的加法运算。
	* @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 ne = new BigDecimal("1");
	   return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}*/
	public static void main(String[] args) {
		Double double1=0.06;
		 Double double2=0.01;
		System.out.println(double1+double2);
		System.out.println(PreciseCompute.add(double1, double2));
	}
	}

  

保留两位小数{
方法一:{
   double   c=3.154215;
   java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00");
   String str = myformat.format(c);    
}

方式二:{
   java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.00"); 
   df.format(你要格式化的数字);
   例:new java.text.DecimalFormat("#.00").format(3.1415926)
   #.00 表示两位小数 #.0000四位小数 以此类推...
}

方式三:{
   double d = 3.1415926;
   String result = String .format("%.2f");
   %.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型
}
}

四舍五入 {
double   f   =   111231.5585; 
BigDecimal   b   =   new   BigDecimal(f); 
//保留2位小数
double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue(); 
}

  

栗子:
public class Test_1 {
    public static void main(String[] args) {
         System.out.println(0.06+0.01);
         System.out.println(1.0-0.42);
        System.out.println(4.015*100);
        System.out.println(303.1/1000);
    }
     
 }

          运行结果如下。

         0.06999999999999999

         0.5800000000000001

         401.49999999999994

         0.30310000000000004

         问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

          其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

          在使用BigDecimal类来进行计算的时候,主要分为以下步骤:

              1、用float或者double变量构建BigDecimal对象。

             2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。

             3、把BigDecimal对象转换成float,double,int等类型。

          一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。

 BigDecimal b1 = new BigDecimal(Double.toString(0.48));
 BigDecimal b2 = BigDecimal.valueOf(0.48);
        对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

 public BigDecimal add(BigDecimal value);                        //加法
 public BigDecimal subtract(BigDecimal value);                   //减法 
 public BigDecimal multiply(BigDecimal value);                   //乘法
 public BigDecimal divide(BigDecimal value);                     //除法

          进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。

  

posted @ 2017-05-05 17:24  ATJAVA  阅读(251)  评论(0编辑  收藏  举报