Java中BigDecimal类的常⽤⽅法
1.简介
BigDecimal类位于java.math.BigDecimal包下。使⽤此类可以完成⼤的⼩数操作,⽽且也可以使⽤此类进⾏精确的四舍五⼊,这⼀点在开发中经常使⽤。
对于不需要任何准确计算精度的程序可以直接使⽤float或double完成,但是如果需要精确计算结果,则必须使⽤BigDecimal类。
2.BigDecimal类常⽤⽅法
2.1.BigDecimal(String val):构造⽅法,将String类型转换成BigDecimal类型数据。
2.2.BigDecimal(double val):构造⽅法,将double类型转换成BigDecimal类型数据。
2.3.BigDecimal(int val):构造⽅法,将int类型转换成BigDecimal类型数据。
2.4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。
2.5.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。
2.6.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。
2.7.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。
2.8.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。
2.9.BigDecimal max(BigDecimal value):最⼤数,求两个BigDecimal类型数据的最⼤值。
2.10.BigDecimal min(BigDecimal value):最⼩数,求两个BigDecimal类型数据的最⼩值。
2.11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。
2.12.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。
代码:
BigDecimal a=new BigDecimal ("4.5");
BigDecimal b=new BigDecimal ("1.5");
BigDecimal c=new BigDecimal ("-10.5");
BigDecimal add_result=a.add(b);
BigDecimal subtract_result=a.subtract(b);
BigDecimal multiply_result=a.multiply(b);
BigDecimal divide_result=a.divide(b);
BigDecimal remainder_ainder(b);
BigDecimal max_result=a.max(b);
BigDecimal min_result=a.min(b);
BigDecimal abs_result=c.abs();
BigDecimal negate_ate();
Log.d("TAG","4.5+1.5="+add_result);
Log.d("TAG","4.5-1.5="+subtract_result);
Log.d("TAG","4.5*1.5="+multiply_result);
Log.d("TAG","4.5/1.5="+divide_result);
Log.d("TAG","4.5/1.5余数="+remainder_result);
Log.d("TAG","4.5和1.5最⼤数="+max_result);
Log.d("TAG","4.5和1.5最⼩数="+min_result);
Log.d("TAG","-10.5的绝对值="+abs_result);
Log.d("TAG","4.5的相反数="+negate_result);
结果:
4.5+1.5=6.0
4.5-1.5=3.0
4.5*1.5=6.75
4.5/1.5=3
4.5/1.5余数=0.0
4.5和1.5最⼤数=4.5
4.5和1.5最⼩数=1.5
-10.5的绝对值=10.5
4.5的相反数=-4.5
这⾥有⼀点需要注意的是除法运算divide。
BigDecimal除法可能出现不能整除的情况,⽐如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
其实divide有三个参数的⽅法
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第⼀参数表⽰除数。
第⼆个参数表⽰⼩数点后保留位数。
第三个参数表⽰舍⼊模式。只有在作除法运算或四舍五⼊时才⽤到舍⼊模式。
舍⼊模式有下⾯这⼏种:
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的⽅向舍⼊
代码:
BigDecimal a=new BigDecimal("4.5");
BigDecimal b=new BigDecimal("1.5");
BigDecimal c=new BigDecimal("2");
BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);
BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);
Log.d("TAG","4.5/1.5="+result1);
Log.d("TAG","4.5/2="+result2);
结果:
4.5/1.5=3.00
4.5/2=2.25
3.BigDecimal ⼩数点处理
需求:计算结果保留三位⼩数。
代码:
/**
* ⽅式1
* 0.000:三位⼩数同理 0.00:两位⼩数依次类推...
bigdecimal除法保留小数* */
double a=3.154215;
DecimalFormat myformat=DecimalFormat("0.000");
String result1 = myformat.format(a);
Log.d("TAG",a+"保留三位⼩数:"+result1);
/**
* ⽅式2
* #.000:三位⼩数同理 #.00:两位⼩数
* */
double b=3.256321;
DecimalFormat df=new DecimalFormat("#.000");
String result2=df.format(b);
Log.d("TAG",b+"保留三位⼩数:"+result2);
/
**
* BigDecimal类操作保留⼏位⼩数
* */
double c=3.558525;
BigDecimal bigDecimal=new BigDecimal(c);
double result3=bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
Log.d("TAG",c+"保留三位⼩数并四舍五⼊:"+result3);
结果:
3.154215保留三位⼩数:3.154
3.256321保留三位⼩数:3.256
3.558525保留三位⼩数并四舍五⼊:3.559
4.总结:
(1)商业计算使⽤BigDecimal。
(2)尽量使⽤参数类型为String的构造函数。
(3) BigDecimal都是不可变的(immutable)的,在进⾏每⼀步运算时,都会产⽣⼀个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论