java中BigDecimal的用法

一、BigDecimal简介

1、特性

2、使用场景

二、创建BigDecimal

//用double创建
BigDecimal one = new BigDecimal(1.5105);
//用String创建
BigDecimal two = new BigDecimal("1.5105");
//用int创建
BigDecimal six = new BigDecimal(1);
//false,用double创建的不精确,一般避免使用
System.out.println(one.equals(two));
//1.510499999999999953814722175593487918376922607421875
System.out.println(one);
//可以先转String,值精确
BigDecimal one = new BigDecimal(Double.toString(1.5105));
//特殊值如下
BigDecimal three = BigDecimal.ONE;//1
BigDecimal four = BigDecimal.TEN;//10
BigDecimal five = BigDecimal.ZERO;//0

三、BigDecimal与其他数据类型之间转换

1、BigDecimal转为其他类型

BigDecimal two = new BigDecimal("-1.5105");
double num1 = two.doubleValue();
float num2 = two.floatValue();
//-1
int num3 = two.intValue();
long num4 = two.longValue();
BigInteger num5 = two.toBigInteger();
String str = two.toString();

 2、其他类型转为BigDecimal

Double num1 = 1.5105;
Integer num2 = 23;
Long num3 = 154652L;
String str = "1.5105";
BigDecimal one1 = new BigDecimal(num1);
BigDecimal one2 = new BigDecimal(num2);
BigDecimal one4 = new BigDecimal(num3);
BigDecimal one3 = new BigDecimal(str);
BigDecimal one5 = BigDecimal.valueOf(num1);
BigDecimal one6 = BigDecimal.valueOf(num2);
BigDecimal one7 = BigDecimal.valueOf(num3);

四、BigDecimal的四则运算

1、常规加减乘除

BigDecimal one = new BigDecimal("66");
BigDecimal two = BigDecimal.valueOf(20.5);
//加法add、减法subtract、66+20.5-20.5
BigDecimal three = one.add(two).subtract(two);
//乘法multiply、除法divide、66*66/20.5
BigDecimal four = three.multiply(one).divide(two);

2、除法保留小数 

1中的除法divide会报以下ArithmeticException算数异常:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

原因是计算结果为无限小数,无法得到精确的值,故要用到保留小数。底层方法如下:

public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode){
	//TODO
}

其中scale参数为保留小数位数,roundingMode为保留小数的方式,使用方式如下:

BigDecimal one = new BigDecimal("66");
BigDecimal two = BigDecimal.valueOf(20.1);
BigDecimal four = one.divide(two,3,BigDecimal.ROUND_UP);
//输出3.284
System.out.println(four);

3、roundingMode参数取值和解释如下:

ROUND_UP        BigDecimal.ROUND_UP=0,直接进位,向远离0的方向保留        1.2-->2        -1.2-->-2

ROUND_DOWN        BigDecimal.ROUND_DOWN=1,直接舍弃,向靠近0的方向保留        1.2-->1        -1.2-->-1

ROUND_CEILING     BigDecimal.ROUND_CEILING=2,向正无穷方向保留                1.2-->2        -1.2-->-1

ROUND_FLOOR       BigDecimal.ROUND_FLOOR=3,向负无穷方向保留                1.2-->1        -1.2-->-2

ROUND_HALF_UP   BigDecimal.ROUND_HALF_UP=4,以5为界,5进位,四舍五入        1.4-->1        -1.5-->-2

ROUND_HALF_DOWN    BigDecimal.ROUND_HALF_DOWN=5,以5为界,5舍位,五舍六入        1.5-->1        -1.6-->-2

ROUND_HALF_EVEN    BigDecimal.ROUND_HALF_EVEN=6,以5为界,5进舍使最后一位为偶数    1.2-->2        -2.2-->-2

ROUND_UNNECESSARY    BigDecimal.ROUND_UNNECESSARY=7,精确值,无舍位操作,scale小于精确小数位数会报错

五、BigDecimal的大小比较

BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = BigDecimal.valueOf(2);
//小于-1
int i1 = one.compareTo(two);
//等于0
int i2 = two.compareTo(two);
//大于1
int i3 = two.compareTo(one);
//是否相等false
boolean res = one.equals(two);

六、BigDecimal的其他常用方法

1、abs绝对值

BigDecimal two = new BigDecimal("-1.5105");
//1.5105
BigDecimal one = two.abs();

2、scale小数位数

BigDecimal two = new BigDecimal("-1.5105");
//4
int scale = two.scale();

3、设置小数位数

//-1.51
BigDecimal two = new BigDecimal("-1.5105").setScale(2,BigDecimal.ROUND_HALF_UP);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值