我是靠谱客的博主 优美万宝路,最近开发中收集的这篇文章主要介绍BigDecimal类详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.简介

BigDecimal类位于java.math.BigDecimal包下。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

 

 

 

 

 

二.BigDecimal类常用方法

 

1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据。

 

2.BigDecimal(double val):构造方法,将double类型转换成BigDecimal类型数据。

 

3.BigDecimal(int val):构造方法,将int类型转换成BigDecimal类型数据。

 

4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。

 

5.BigDecimal subtract(BigDecimal value):减法求两个BigDecimal类型数据的差。

 

6.BigDecimal multiply(BigDecimal  value):乘法求两个BigDecimal类型数据的积。

 

7.BigDecimal divide(BigDecimal divisor):除法求两个BigDecimal类型数据的商。

 

8.BigDecimal remainder(BigDecimal divisor):求余数BigDecimal类型数据除以divisor的余数。

 

9.BigDecimal max(BigDecimal value):最大数求两个BigDecimal类型数据的最大值。

 

10.BigDecimal min(BigDecimal value):最小数求两个BigDecimal类型数据的最小值。

 

11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。

 

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_result = a.remainder(b);
BigDecimal max_result = a.max(b);
BigDecimal min_result = a.min(b);
BigDecimal abs_result = c.abs();
BigDecimal negate_result = a.negate();


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

 

 

 

 

 

三.BigDecimal 小数点处理

 

需求:计算结果保留三位小数。

代码

//方式1 0.000:三位小数 同理 0.00:两位小数 依次类推...
double a = 3.154215;
DecimalFormat myformat = new java.text.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);
        

//方式3 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

 

 

 

 

四.总结

<1> 商业计算使用BigDecimal。

<2> 尽量使用参数类型为String的构造函数。

<3> BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

 

 

 

 

 

 

最后

以上就是优美万宝路为你收集整理的BigDecimal类详解的全部内容,希望文章能够帮你解决BigDecimal类详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部