• 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()等方法。
    

      

  • 相关阅读:
    MySql中的变量定义
    mysql常用脚本
    Spring中依赖注入的使用和配置
    在linux下通过sh运行java程序
    linux下shell脚本学习
    eclipse导出jar包
    mysql中游标的使用
    netty中LengthFieldBasedFrameDecoder的使用
    网络游戏服务器架构(转)
    H2 database的使用
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6814069.html
Copyright © 2020-2023  润新知