学习任务:

视频学习BigDecimal

动手测试BigDecimal

BigDecimal所在包是在java.math包下,在使用的时候就需要进行导包。要用BigDecimal类,那么就需要首先学习一下如何去创建BigDecimal的对象,通过查看API文档,我们可以发现Jdk中针对BigDecimal类提供了很多的构造方法,但是最常用的构造方法是通过字符串来创建BigDecimal。

image-20200926095936791

下边是它的常用方法:

// 加法运算
public BigDecimal add(BigDecimal value)			
// 减法运算
public BigDecimal subtract(BigDecimal value)		
// 乘法运算
public BigDecimal multiply(BigDecimal value)		
// 除法运算
public BigDecimal divide(BigDecimal value)		

接下来我们就来通过一些案例演示一下这些成员方法的使用。

package com.pbteach.javase.pop.api.bigdecimal;

import java.math.BigDecimal;

/**
 * BigDecimal测试
 * @author 攀博课堂
 * @version v1.0
 */
public class BigDecimalTest {

	//BigDecimal的基本使用
	public static void test1() {
//		System.out.println(0.09 + 0.01);
		// 创建两个BigDecimal对象
        BigDecimal a = new BigDecimal("0.5") ;
        BigDecimal b = new BigDecimal("2") ;
        System.out.println(a.add(b));//加
        System.out.println(a.subtract(b));//减
        System.out.println(a.multiply(b));//乘
        System.out.println(a.divide(b));//除
		BigDecimal  bigDecima3 = new BigDecimal(0.09);
		BigDecimal  bigDecima4 = new BigDecimal(0.01);
		BigDecimal sum = bigDecima3.add(bigDecima4);
		//保留两位小数,四舍五入
		sum = sum.setScale(2, RoundingMode.HALF_DOWN);
		System.out.println(sum);
	}
	public static void main(String[] args) {
		test1();
	}
}

输出:

2.5
-1.5
1.0
0.25
0.10

如果使用BigDecimal类型的数据进行除法运算的时候,得到的结果是一个无限循环小数,那么就会报错:ArithmeticException。 如下代码所示:

/**
	 * 
	 * BigDecimal除法存在无限循环小数
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static void test2() {
		// 创建两个BigDecimal对象
        BigDecimal a = new BigDecimal("1") ;
        BigDecimal b = new BigDecimal("6") ;
        System.out.println(a.divide(b));//除
		
	}
	public static void main(String[] args) {
		test2();
	}

运行程序进行测试,控制台输出结果如下所示:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(BigDecimal.java:1693)
	at com.pbteach.javase.pop.api.bigdecimal.BigDecimalTest.test2(BigDecimalTest.java:35)
	at com.pbteach.javase.pop.api.bigdecimal.BigDecimalTest.main(BigDecimalTest.java:53)

针对这个问题怎么解决,此时我们就需要使用到BigDecimal类中另外一个divide方法,如下所示:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

上述divide方法参数说明:

divisor:			除数对应的BigDecimal对象;
scale:				精确的位数;
roundingMode:		取舍模式;
取舍模式被封装到了RoundingMode这个枚举类中,最常见的取舍方式有如下几个:
UP(直接进1) 、 FLOOR(直接删除) 、 HALF_UP(四舍五入)

接下来我们就来演示一下这些取舍模式,代码如下所示:

/**
	 * 
	 * BigDecimal除法存在无限循环小数
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static void test3() {
		// 创建两个BigDecimal对象
        BigDecimal a = new BigDecimal("1") ;
        BigDecimal b = new BigDecimal("6") ;
        System.out.println(a.divide(b , 2 , RoundingMode.HALF_UP));
        System.out.println(a.divide(b , 2 , RoundingMode.FLOOR));
        System.out.println(a.divide(b , 2 , RoundingMode.UP));		
	}
	public static void main(String[] args) {
		test3();
	}

输出:

0.17
0.16
0.17

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题