BigDecimal

定义

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

BigDecimal的使用

为什么要使用BigDecimal? 浮点数的计算会出现精度损失
构造方法

//BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
new BigDecimal(1);
//BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 也会造成精度损失
new BigDecimal(12.2);
//BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 
new BigDecimal(21l);
//BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
new BigDecimal("21.1");

注意:BigDecimal(double)方式也会造成精度损失,通常一般使用BigDecimal(String) 例如:new BigDecimal(Double.toString(12.1))
常用方法:

BigDecimal first = new BigDecimal(1);
BigDecimal secode = new BigDecimal(2);
//add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。 
first.add(secode); //3
//subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
first.subtract(secode); //-1
//multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。 
first.multiply(secode); //2
//divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。
first.divide(secode,BigDecimal.ROUND_UNNECESSARY); //0.5
//toString()                将BigDecimal对象的数值转换成字符串。 
first.toString(); //"1"
//doubleValue()          将BigDecimal对象中的值以双精度数返回。 
first.doubleValue(); //1.0
//floatValue()             将BigDecimal对象中的值以单精度数返回。 
first.floatValue(); //1.0f
//longValue()             将BigDecimal对象中的值以长整数返回。 
first.longValue(); //1l
//intValue()               将BigDecimal对象中的值以整数返回。
first.intValue(); //1

注意:在执行divide(BigDecimal)方法时,如果结果不能整除,有余数就会报java.lang.ArithmeticException: 错误 需要使用divide(BigDecimal,保留小数点后几位小数,舍入模式)方法

BigDecimal first = new BigDecimal("10");
BigDecimal secode = new BigDecimal("3");
//ROUND_CEILING    向正无穷方向舍入
first.divide(secode,2,BigDecimal.ROUND_CEILING);//3.34
//ROUND_DOWN    向零方向舍入
first.divide(secode,2,BigDecimal.ROUND_DOWN);//3.33
//ROUND_FLOOR    向负无穷方向舍入
first.divide(secode,2,BigDecimal.ROUND_FLOOR);//3.33
//ROUND_HALF_DOWN    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
first.divide(secode,2,BigDecimal.ROUND_HALF_DOWN);//3.33
//ROUND_HALF_EVEN    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
first.divide(secode,2,BigDecimal.ROUND_HALF_EVEN);//3.33
//ROUND_HALF_UP    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
first.divide(secode,2,BigDecimal.ROUND_HALF_UP);//3.33
//ROUND_UNNECESSARY    计算结果是精确的,不需要舍入模式
first.divide(secode,2,BigDecimal.ROUND_UNNECESSARY);//3.33
//ROUND_UP    向远离0的方向舍入
first.divide(secode,2,BigDecimal.ROUND_UP);//3.34

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厭氧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值