BigDecimal的使用
1 BigDecimal的构造方法
//1 BigDecimal的构造方法
BigDecimal intBD = new BigDecimal(1);
BigDecimal longBD = new BigDecimal(1L);
//禁止使用double的bigDecimal的构造方法
BigDecimal doubleBD = new BigDecimal(1.1111);
//结果:1.111099999999999976552089719916693866252899169921875
//以下为推荐模式
BigDecimal stringBD = new BigDecimal(Double.toString(1.1111));
BigDecimal strBD = BigDecimal.valueOf(1.1111);
2 四则运算
//2 四则运算
?
//add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
//subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
//multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
//divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
?
BigDecimal three = new BigDecimal(3);
BigDecimal nine = new BigDecimal(10);
BigDecimal add = three.add(nine);
System.out.println(add);
BigDecimal subtract = three.subtract(nine);
System.out.println(subtract);
BigDecimal multiply = three.multiply(nine);
System.out.println(multiply);
?
//BigDecimal divide = three.divide(nine);
//进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:
?
//(BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
3 八种舍入模式
//3 八种舍入模式
//3.1、ROUND_UP
// 舍入远离零的舍入模式。
// 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
// 注意,此舍入模式始终不会减少计算值的大小。
?
BigDecimal divide = three.divide(nine,4, BigDecimal.ROUND_UP);
System.out.println(divide);
//结果: 0.3334
?
//3.2、ROUND_DOWN
//接近零的舍入模式。
//在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
//注意,此舍入模式始终不会增加计算值的大小。
divide = three.divide(nine,4, BigDecimal.ROUND_DOWN);
System.out.println(divide);
//结果: 0.3333
?
//3.3、ROUND_CEILING 接近正无穷大的舍入模式。
// 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
// 如果为负,则舍入行为与 ROUND_DOWN 相同。
// 注意,此舍入模式始终不会减少计算值
divide = three.divide(nine,4, BigDecimal.ROUND_CEILING);
System.out.println(divide);
//结果: 0.3334
?
//3.4、ROUND_FLOOR
//接近负无穷大的舍入模式。
//如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
//如果为负,则舍入行为与 ROUND_UP 相同。
//注意,此舍入模式始终不会增加计算值。
divide = three.divide(nine,4, BigDecimal.ROUND_FLOOR);
System.out.println(divide);
//结果: 0.3333
?
//5、ROUND_HALF_UP
//向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
//如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
//注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
divide = three.divide(nine,4, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
//结果: 0.3333
?
//3.6、ROUND_HALF_DOWN
//向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
//如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
divide = three.divide(nine,4, BigDecimal.ROUND_HALF_DOWN);
System.out.println(divide);
//结果: 0.3333
?
//3.7、ROUND_HALF_EVEN
//向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
//如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
//如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
//注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
//此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
//如果前一位为奇数,则入位,否则舍去。
//以下例子为保留小数点1位,那么这种舍入方式下的结果。
//1.15>1.2 1.25>1.2
divide = three.divide(nine,4, BigDecimal.ROUND_HALF_EVEN);
System.out.println(divide);
//结果: 0.3333
?
//3.8、ROUND_UNNECESSARY
//断言请求的操作具有精确的结果,因此不需要舍入。
//结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:
//divide = three.divide(nine,4, BigDecimal.ROUND_UNNECESSARY);
//System.out.println(divide);
//结果: ArithmeticException: Rounding necessary
4 推荐使用模式的枚举
//4 推荐使用模式的枚举
?
//4.1舍入远离零的舍入模式
divide = three.divide(nine,4,RoundingMode.UP);
//4.2接近零的舍入模式
divide = three.divide(nine,4,RoundingMode.DOWN);
//4.3接近正无穷大的舍入模式
divide = three.divide(nine,4,RoundingMode.CEILING);
//4.4接近负无穷大的舍入模式
divide = three.divide(nine,4,RoundingMode.FLOOR);
//4.5向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
divide = three.divide(nine,4,RoundingMode.HALF_UP);
//4.6向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式
divide = three.divide(nine,4,RoundingMode.HALF_DOWN);
//4.7向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
divide = three.divide(nine,4,RoundingMode.HALF_EVEN);
//4.8断言请求的操作具有精确的结果,因此不需要舍入
//divide = three.divide(nine,4,RoundingMode.UNNECESSARY);
5 BigDecimal转百分比
//5 BigDecimal转百分比
BigDecimal bigDecimal =BigDecimal.valueOf(0.3);
NumberFormat percent = NumberFormat.getPercentInstance();
?
//percent.setMinimumFractionDigits(2);
//结果: 30.00%
percent.setMaximumFractionDigits(2);
//结果: 30%
String percentage = percent.format(bigDecimal.doubleValue());
System.out.println(percentage);
6 测试代码
package com.saiyou.test;
?
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
?
/**
* @author : lyn
* 技术点 :
* @description:
* @date : 2022/1/10 22:28
*/
public class BigDecimalTest {
public static void main(String[] args) {
//1 BigDecimal的构造方法
BigDecimal intBD = new BigDecimal(1);
BigDecimal longBD = new BigDecimal(1L);
//禁止使用double的bigDecimal的构造方法
BigDecimal doubleBD = new BigDecimal(1.1111);
//结果:1.111099999999999976552089719916693866252899169921875
//以下为推荐模式
BigDecimal stringBD = new BigDecimal(Double.toString(1.1111));
BigDecimal strBD = BigDecimal.valueOf(1.1111);
?
//2 四则运算
?
//add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
//subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
//multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
//divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
?
BigDecimal three = new BigDecimal(3);
BigDecimal nine = new BigDecimal(10);
BigDecimal add = three.add(nine);
System.out.println(add);
BigDecimal subtract = three.subtract(nine);
System.out.println(subtract);
BigDecimal multiply = three.multiply(nine);
System.out.println(multiply);
?
//BigDecimal divide = three.divide(nine);
//进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:
?
//(BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
//3 八种舍入模式
//3.1、ROUND_UP
// 舍入远离零的舍入模式。
// 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
// 注意,此舍入模式始终不会减少计算值的大小。
?
BigDecimal divide = three.divide(nine,4, BigDecimal.ROUND_UP);
System.out.println(divide);
//结果: 0.3334
?
//3.2、ROUND_DOWN
//接近零的舍入模式。
//在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
//注意,此舍入模式始终不会增加计算值的大小。
divide = three.divide(nine,4, BigDecimal.ROUND_DOWN);
System.out.println(divide);
//结果: 0.3333
?
//3.3、ROUND_CEILING 接近正无穷大的舍入模式。
// 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
// 如果为负,则舍入行为与 ROUND_DOWN 相同。
// 注意,此舍入模式始终不会减少计算值
divide = three.divide(nine,4, BigDecimal.ROUND_CEILING);
System.out.println(divide);