BigDecimal常用方法合集
前言
针对一些企业级的开发和计算,double或者float的精度会造成数据的丢失,因此一般会用BigDecimal这个类来进行浮点计算。并且BigDecimal也对应了MYSQL中decimal类型。也算比较常见。
提示:以下是本人自学的代码,如有错误还请改正。
一、初始化
因为BigDecimal是引用类型,所以不能直接用=幅值。
//String参数的构造方法
BigDecimal b1 = new BigDecimal("75.00");//75.00
BigDecimal b2 = new BigDecimal("1.5");//1.5
//静态方法valueOf
BigDecimal b3 = BigDecimal.valueOf(75.00);//75.0
BigDecimal b4 = BigDecimal.valueOf(1.5);//1.5
/*
注意:这里不建议使用double参数的构造,因为double会造成精度丢失
*/
BigDecimal b5 = new BigDecimal(75.01);//75.0100000000000051159076974727213382720947265625
BigDecimal b6 = new BigDecimal(1.1);//1.100000000000000088817841970012523233890533447265625
二、常用api
加 + add()
//加法 小数位以长的为准
System.out.println(BigDecimal.valueOf(25.04).add(BigDecimal.valueOf(75.69)));//100.73
减 - subtract()
//减法 小数位以长的为准
System.out.println(BigDecimal.valueOf(25.04).subtract(BigDecimal.valueOf(75.69)));//-50.65
乘 * multiply()
//乘法 小数位=两数小数位之和
System.out.println(BigDecimal.valueOf(25.04).multiply(BigDecimal.valueOf(75.69)));//1895.2776
除 / divide()
//除法 除法必须指定小数位数(规范)不然精度会丢失
/*
进位枚举类:
ROUND_CEILING:舍位时往正无穷方向移动
正数:1.1 -> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -1 -1.5-> -1 -1.8-> -1
ROUND_DOWN:向0的方向移动
正数:1.1-> 1 1.5-> 1 1.8-> 1
负数:-1.1-> -1 -1.5-> -1 -1.8> -1
ROUND_FLOOR:与CEILING相反,往负无穷
正数: 1.1-> 1 1.5-> 1 1.8-> 1
负数: -1.1-> -2 -1.5-> -2 -1.8-> -2
ROUND_HALF_DOWN:以5为分界线,或曰五舍六入
正数:1.5-> 1 1.6-> 2
负数:-1.5-> -1 -1.6-> -2
ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数
1.15-> 1.2 1.16-> 1.2 1.25-> 1.2 1.26-> 1.3
ROUND_HALF_UP:最常见的四舍五入
ROUND_UNNECESSARY:无需舍位
ROUND_UP与ROUND_DOWN相反,远离0的方向
正数:1.1-> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -2 -1.5-> -2 -1.8-> -2
*/
System.out.println("四舍五入保存4为小数的 75.00/ 2.0 : "+b1.divide(BigDecimal.valueOf(2.0),4,BigDecimal.ROUND_HALF_UP));//37.5000
截断 setScale()
/*
截断,保留几位小数
ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入
*/
System.out.println("12.98576截断,保留2位小数 : "+BigDecimal.valueOf(12.98576).setScale(2, RoundingMode.HALF_UP));//12.99
System.out.println("显示小数位数的: "+b1.scale()); //2
BigDecimal比较大小 compareTo()
/*
BigDecimal比较大小是通过compareTo比较器比较
*/
System.out.println("前 10 < 后 5 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(5)) < 0));//false
System.out.println("前 10 > 后 5 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(5)) > 0));//true
System.out.println("前 10 = 后 10 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(10)) == 0));//true
获取方法value()
System.out.println("返回double值"+BigDecimal.valueOf(15.15).doubleValue());
System.out.println("返回float值"+BigDecimal.valueOf(15.15).floatValue());
System.out.println("返回int值"+BigDecimal.valueOf(15.15).intValue());
System.out.println("返回BigInteger值"+BigDecimal.valueOf(15.15).unscaledValue());
System.out.println("返回short值"+BigDecimal.valueOf(15.15).shortValue());
//,如果没有小数位并且在short取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
System.out.println("返回short值并检查"+BigDecimal.valueOf(15.15).shortValueExact());
System.out.println("返回long值"+BigDecimal.valueOf(15.15).longValue());
//如果没有小数位并且在long取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
System.out.println("返回long值"+BigDecimal.valueOf(15.15).longValueExact());
System.out.println("返回byte值"+BigDecimal.valueOf(15.15).byteValue());
//如果没有小数位并且在byte取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
System.out.println("返回byte值"+BigDecimal.valueOf(15.15).byteValueExact());