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_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

3.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); /**
* 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)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

Java中BigDecimal类的常用方法的更多相关文章

  1. java中File类的常用方法总结

    java中File类的常用方法 创建: createNewFile()在指定的路径创建一个空文件,成功返回true,如果已经存在就不创建,然后返回false. mkdir() 在指定的位置创建一个此抽 ...

  2. Java中BigDecimal类介绍及用法

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...

  3. java 中String类的常用方法总结,带你玩转String类。

    String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...

  4. java 中String类的常用方法总结,玩转String类

    String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...

  5. Java中TimeZone类的常用方法

    一.TimeZone类的定义 TimeZone类是一个抽象类,主要包含了对于时区的各种操作,可以进行计算时间偏移量或夏令时等操作 二.TimeZone类的常用方法 1.getAvailableIDs( ...

  6. Java中BigDecimal类

    由于在运算的时候,float类型和double很容易丢失精度,演示案例,所以,为了能精确地表示.计算浮点数,Java提供了BIgDecimal BigDecimal类的概述 不可变的.任意精度的有符号 ...

  7. Java中String类的常用方法

    判断功能的方法 public boolean equals (Object anObject) :将此字符串与指定对象进行比较. public boolean equalsIgnoreCase (St ...

  8. Java中StringBuffer类的常用方法

    StringBuffer:StringBuffer类型 描述:在实际应用中,经常回遇到对字符串进行动态修改.这时候,String类的功能受到限制,而StringBuffer类可以完成字符串的动态添加. ...

  9. java中Vector类的常用方法

    Vector类是实现List接口,所以继承的方法就不在这里讲了 https://www.cnblogs.com/xiaostudy/p/9503199.html public void add(int ...

随机推荐

  1. Spring MVC教程——检视阅读

    Spring MVC教程--检视阅读 参考 Spring MVC教程--一点--蓝本 Spring MVC教程--c语言中午网--3.0版本太老了 Spring MVC教程--易百--4.0版本不是通 ...

  2. Java面试札记

    Java面试札记  在最深的夜里,即使是你的影子也会离你而去. 背景:愿某人在中秋节之前吃上大厂月饼!!!@CDZ 1.Java的八种基本数据类型? 整型:byte.int.short.long: 浮 ...

  3. 【雕爷学编程】Arduino动手做(45)---红外避障传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  4. uwsgi模块以参数形式运行项目

    1.虚拟环境中下载uwsgi模块-------pip install uwsgi 2.脚本运行案例 新建一个test.py脚本文件,写入如下内容: def application(env, start ...

  5. 基于elementUI使用v-model实现经纬度输入的vue组件

    绑定一个 [12.34,-45.67] (东经西经,南纬北纬 正负表示) 形式的经纬度数组,能够按度分秒进行编辑,效果如下所示,点击东经,北纬可切换. 经纬度的 度转度分秒 能够获取度分秒格式数据 C ...

  6. Java面试题小结(一)

    ---恢复内容开始--- 1.用Java解析xml有几种方式,实现场景.区别以及优缺点: 有四种 分别是JDOM.SEX.DOM.JDOM4J 实现场景: JDOM:实现功能简单的地方,例如:解析: ...

  7. HDU1588

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:g(i)= k * i + b. 给定 k 和 b,求0 <= i < n ...

  8. python之Phantomjs无界面浏览器引擎自动化测试

    文字搬运工,本文主要介绍PhantomJS功能,其中有屏幕快照功能,为后面更新[python接口自动化脚本更新版本],其中新版本中新增自动发送邮件功能正文带图片,使用PhantomJS截取图片后发送邮 ...

  9. python的性能测试(timeit)

    import timeit def test(): lista = [] listb = [] for i in range(100): lista.append(i) for i in range( ...

  10. 关于Vue data对象赋值的问题

    遇到这么一个问题: 把data中的某个对象赋值给一个变量,修改变量,会同时把data中的对象也一同修改,所以,这个赋值应该就是引用了地址,贴个代码 <script> export defa ...