精华内容
下载资源
问答
  • BigDecimal加减乘除运算

    万次阅读 2019-12-13 16:28:25
    BigDecimal作为涉及到钱或者有小数点要求时经常用到的数据类型拥有其特殊的地方,在加减乘除运算上与Integer类型不同。 【1】BigDecimal变量定义及赋值 一般的变量定义是:类型 变量名称=变量值。 但是BigDecimal...

    BigDecimal作为涉及到钱或者有小数点要求时经常用到的数据类型拥有其特殊的地方,在加减乘除运算上与Integer类型不同。

    【1】BigDecimal变量定义及赋值

    一般的变量定义是:类型 变量名称=变量值。

    但是 BigDecimal的赋值是不同的,BigDecimal赋值是

    BigDecimal money = new BigDecimal(100);或者BigDecimal money= new BigDecimal("100")。

    【2】BigDecimal类型运算

    加法: add()     

    减法:subtract()

    乘法:multiply()    

    除法:divide()    

    绝对值:abs()

    【3】实例展示

    BigDecimal num1= new BigDecimal("100");

    BigDecimal num2= new BigDecimal("10");

    BigDecimal result;

    【3.1】加法

    result= num1.add(num2);

    System.out.println("加法运算结果是:" + result);

    【3.2】减法

    result= num1.subtract(num2);

    System.out.println("减法运算结果是:" + result);

    【3.3】乘法

    result= num1.multiply(num2);

    System.out.println("乘法运算结果是:" + result);  

    【3.4】除法

    result= num1.divide(num2);

    System.out.println("除法运算结果是:" + result);

    搞定啦。

    展开全文
  • 主要介绍了如何使用BigDecimal进行精确运算,最后提供了一个工具类,该工具类提供,乘,除运算
  • 2、BigDecimal初始化赋值3、BigDecimal加减乘除运算4、BigDecimal比较大小5、BigDecimal保留两位小数及舍入模式6、BigDecimal其他方法及常量 1、为什么要用BigDecimal ? 工作中我们通过浮点数进行运算时,好像时...

    1、为什么要用BigDecimal ?

    工作中我们通过浮点数进行运算时,好像时不时的会出现一些小误差。例如:

    public static void main(String[] args) {
        System.out.println(1.9 - 1.2);
        System.out.println(1.9 - 1.5);
        System.out.println(100 - 99.8);
    }
    

    在这里插入图片描述
    大致搜了一下原因,网上说我们的计算机是二进制的,而浮点数是没有办法通过二进制精准的表示出来。
    也就导致在运算的时候,float类型和double类型很容易丢失精度。
    所以在开发中,如果我们需要精确计算的结果,可以使用java.math包中提供的BigDecimal类来进行操作。

    2、BigDecimal初始化赋值

    方法类型描述
    public BigDecimal(int val)构造函数int类型的值生成BigDecimal对象
    public BigDecimal(long val)构造函数long类型的值生成BigDecimal对象
    public BigDecimal(String val)静态方法String类型的值转换为BigDecimal类型
    public static BigDecimal valueOf(double val)静态方法double类型的值转换为BigDecimal类型
    public static BigDecimal valueOf(long val)静态方法long类型(包含int类型)的值转换为BigDecimal类型
    • 代码示例:
    BigDecimal b = new BigDecimal("33");
    BigDecimal c = BigDecimal.valueOf(4.7);
    
    • 注意:不建议使用public BigDecimal(double val)方式初始化值,编码时idea提示禁止使用构造方法BigDecimal(double),描述如下:
    使用了new BigDecimal(double)构造函数 less... (Ctrl+F1) 
    Inspection info: 
    禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象 说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
                
    Negative example(不建议使用):
        BigDecimal good1 = new BigDecimal(0.1);
    
    Positive example(建议使用):
        BigDecimal good1 = new BigDecimal("0.1");
        BigDecimal good2 = BigDecimal.valueOf(0.1);
    

    在这里插入图片描述

    3、BigDecimal的加减乘除运算

    运算法则对应方法
    加法public BigDecimal add(BigDecimal value)
    减法public BigDecimal subtract(BigDecimal value)
    乘法public BigDecimal multiply(BigDecimal value)
    除法public BigDecimal divide(BigDecimal value)
    • 代码示例:
    public static void main(String[] args) {
        System.out.println("计算加法: " + BigDecimal.valueOf(1.9).add(BigDecimal.valueOf(0.2)));
        System.out.println("计算减法: " + BigDecimal.valueOf(1.9).subtract(BigDecimal.valueOf(1.5)));
        System.out.println("计算乘法: " + BigDecimal.valueOf(1.9).multiply(BigDecimal.valueOf(0.2)));
        System.out.println("计算除法: " + BigDecimal.valueOf(1.9).divide(BigDecimal.valueOf(0.2)));
    }
    

    在这里插入图片描述

    • 注意1:BigDecimal的运算结果都是返回了一个新的BigDecimal对象,并不是在原有的对象上进行操作。
    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(5);
        System.out.println("a的地址:" + System.identityHashCode(a));
        a = a.add(BigDecimal.valueOf(3));
        System.out.println("计算后a的地址:" + System.identityHashCode(a));
    }
    

    在这里插入图片描述

    • 注意2:使用divide除法函数除不尽,出现无线循环小数的时候,就需要使用另外精确的小数位数以及舍入模式,不然会出现报错。例如:
    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(10), b = BigDecimal.valueOf(3);
        System.out.println(a.divide(b));
    }
    
    // 该程序运行会出现以下错误
    Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
        at java.math.BigDecimal.divide(BigDecimal.java:1690)
        at com.fivesix._05_bigdecimal.Demo01.main(Demo01.java:31)
    

    解决方法如下(此处舍入模式使用四舍五入的方式,其他模式在该文章后面有讲解):

    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(10), b = BigDecimal.valueOf(3);
        System.out.println(a.divide(b, 3, BigDecimal.ROUND_HALF_UP));
    }
    // 该程序运行后输出:
    3.33
    

    4、BigDecimal比较大小

    public int compareTo(BigDecimal val)
    

    BigDecimal类提供的比较值的方法,注意比较的两个值均不能为空
    a.compareTo(b)得到结果 1, 0, -1。

    比较结果描述
    1a 大于b
    0a 等于b
    -1a 小于b
    • 代码示例:
    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(1);
        BigDecimal b = BigDecimal.valueOf(2);
        BigDecimal c = BigDecimal.valueOf(1);
        BigDecimal d = BigDecimal.ZERO;
        System.out.println("1和2比较结果:" + a.compareTo(b));
        System.out.println("1和1比较结果:" + a.compareTo(c));
        System.out.println("1和0比较判断:" + (a.compareTo(d) > 0) );
    }
    

    在这里插入图片描述

    5、BigDecimal保留两位小数及舍入模式

    public BigDecimal setScale(int newScale, int roundingMode)
    

    用于格式化小数的方法,第一个值表示保留几位小数,第二个值表示格式化的类型。
    8种类型如下:

    格式化类型描述
    ROUND_DOWN舍弃多余位数,如1.55会格式化为1.5,-1.55会格式化为-1.5
    ROUND_UP进位处理,如1.52会格式化为1.6,-1.52会格式化为-1.6
    ROUND_HALF_UP四舍五入,如果舍弃部分>= .5,则进位
    ROUND_HALF_DOWN五舍六入,如果舍弃部分> .5,则进位
    ROUND_CEILING正无穷大方向舍入模式。如果值为正数,则与ROUND_UP模式相同;如果值为负数,则与ROUND_DOWN模式相同
    ROUND_FLOOR负无穷大方向舍入模式。如果值为正数,则与ROUND_DOWN模式相同;如果值为负数,则与ROUND_UP模式相同
    ROUND_UNNECESSARY确认值的小数位数是否与传入第一个参数(保留小数的位数)相等,如果符合则返回值,如果不符抛出异常
    ROUND_HALF_EVEN如果舍弃部门左边的数字为奇数,则与ROUND_HALF_UP模式相同,如果为偶数则与ROUND_HALF_DOWN模式相同
    • 代码示例:
    public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(5.445);
        System.out.println("5.445舍弃多余位数:" + a.setScale(2, BigDecimal.ROUND_DOWN));
        System.out.println("5.445进位处理:" + a.setScale(2, BigDecimal.ROUND_UP));
        System.out.println("5.445四舍五入(舍弃部分>= .5,进位):" + a.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println("5.445四舍五入(舍弃部分未> .5,舍弃):" + a.setScale(2, BigDecimal.ROUND_HALF_DOWN));
        System.out.println("5.446四舍五入(舍弃部分> .5,进位):" + BigDecimal.valueOf(5.446).setScale(2, BigDecimal.ROUND_HALF_DOWN));
    }
    

    在这里插入图片描述

    6、BigDecimal其他方法及常量

    代码类型描述
    BigDecimal.ZERO常量初始化一个为0的BigDecimal对象
    BigDecimal.ONE常量初始化一个为1的BigDecimal对象
    BigDecimal.TEN常量初始化一个为10的BigDecimal对象
    public BigDecimal abs()方法求绝对值,不管正数还是负数,都得到正数
    public BigDecimal negate()方法求相反数,正变负,负变正
    public BigDecimal pow(int n)方法求乘方,如BigDecimal.valueOf(2).pow(3)的值为8
    public BigDecimal max(BigDecimal val)方法两值比较,返回最大值
    public BigDecimal min(BigDecimal val)方法两值比较,返回最小值
    展开全文
  • BigDecimal加减乘除运算工具类
    import java.math.BigDecimal;   
    
    /**  
    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
    * 确的浮点数运算,包括加减乘除和四舍五入。  
    */  
    public class Arith{ 
    	//默认除法运算精度   
    	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 one = new BigDecimal("1");   
    		return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
    	}   
    }
    
    展开全文
  • BigDecimal运算整理,尤其除法的坑,真的不要再踩一次

    加法

    	BigDecimal b1 = new BigDecimal(10);
    	BigDecimal b2 = new BigDecimal(5);
    	System.out.println(b1.add(b2));
    	// 输出结果:15
    
    	BigDecimal b3 = new BigDecimal(13.14);
    	BigDecimal b4 = new BigDecimal(5.20);
    	System.out.println(b3.add(b4));
    	// 输出结果:18.34000000000000074606987254810519516468048095703125
    	System.out.println(b3.add(b4).setScale(2, BigDecimal.ROUND_HALF_UP));
    	// 输出结果:18.34
    

    减法

    	BigDecimal b1 = new BigDecimal(10);
    	BigDecimal b2 = new BigDecimal(5);
    	System.out.println(b1.subtract(b2));
    	// 输出结果:5
    
    	BigDecimal b3 = new BigDecimal(13.14);
    	BigDecimal b4 = new BigDecimal(5.20);
    	System.out.println(b3.subtract(b4));
    	// 输出结果:7.94000000000000039079850466805510222911834716796875
    	System.out.println(b3.subtract(b4).setScale(2, BigDecimal.ROUND_HALF_UP));
    	// 输出结果:7.94
    

    乘法

    	BigDecimal b1 = new BigDecimal(10);
    	BigDecimal b2 = new BigDecimal(5);
    	System.out.println(b1.multiply(b2));
    	// 输出结果:50
    
    	BigDecimal b3 = new BigDecimal(13.14);
    	BigDecimal b4 = new BigDecimal(5.20);
    	System.out.println(b3.multiply(b4));
    	// 输出结果:68.328000000000005289990667733945984784716040408651717701256356196637398170423693954944610595703125
    	System.out.println(b3.multiply(b4).setScale(2, BigDecimal.ROUND_HALF_UP));
    	// 输出结果:68.33
    

    除法

    	BigDecimal b1 = new BigDecimal(10);
    	BigDecimal b2 = new BigDecimal(5);
    	System.out.println(b1.divide(b2));
    	// 输出结果:2
    	
    	BigDecimal b3 = new BigDecimal(10);
    	BigDecimal b4 = new BigDecimal(3);
    	System.out.println(b3.divide(b4));
    	// 提示Non-terminating decimal expansion; no exact representable decimal result异常
    
    	BigDecimal b5 = new BigDecimal(13.14);
    	BigDecimal b6 = new BigDecimal(5.20);
    	System.out.println(b5.divide(b6));
    	// 提示Non-terminating decimal expansion; no exact representable decimal result异常
    	System.out.println(b5.divide(b6).setScale(2, BigDecimal.ROUND_HALF_UP));
    	// 提示Non-terminating decimal expansion; no exact representable decimal result
    	System.out.println(b5.divide(b6,2,BigDecimal.ROUND_HALF_UP));
    	// 输出结果:2.53
    

    加、减、乘其实没什么好说的,值得注意的是当BigDecimal对象是以new BIgDecimal(double val)创建的,则执行加、减、乘运算时会存在精度问题,需要设置需要保留的小数位和进位方式,即使用setScale方法;
    而对于除法,无论是参数是double类型的,还是除不尽的情况,都需要做格式化,否则会报Non-terminating decimal expansion; no exact representable decimal result异常,且写法与加、减、乘不一样。

    展开全文
  • BigDecimal n1 = new BigDecimal("0.01"); BigDecimal n2 = new BigDecimal("0.02"); System.out.println("加法:"+n2.add(n1)); 加法:0.03 减法subtract()函数 BigDecimal n1 = new BigDecimal("0.01"); ...
  • Java BigDecimal加减乘除运算

    千次阅读 2020-07-16 19:44:23
    import java.math.BigDecimal; /** * * <p> * Description: * </p> * * @author xuyangwei * * @date 2020年7月16日 * */ public class BigdecimalTest { public static void main...
  • java.math.BigDecimalBigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val) Translates a double into a BigDecimal. 第二种:BigDecimal(String val) Transla...
  • 在java中的Bigdecimal类型的数据进行加减乘除运算的时候要调用以下方法: 加法:add 减法:subtract 乘法:multiply 除法:divide 例如: BigDecimal i = new BigDecimal(2); BigDecimal j = new BigDecimal(1);...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,651
精华内容 1,460
关键字:

bigdecimal加减乘除运算