BigDecimal的创建方式、加减乘除、舍入模式、和其他类型的转换
- 1、简介
- 2、常用API方法
-
- 2.1 BigDecimal创建的几种方式
- 2.2 BigDecimal和其他类型之间的转换
-
- 2.2.1、BigDecimal转double
- 2.2.2、double转BigDecimal
- 2.2.3、字符串转BigDecimal
- 2.2.4、int和long转BigDecimal
- 2.2.5、BigDecimal转int和long
- 2.3 BigDecimal中的加减乘
- 2.4 BigDecimal中的舍入模式
-
- 2.4.1 ROUND_CEILING
- 2.4.2 ROUND_DOWN
- 2.4.3 ROUND_HALF_UP
- 2.4.4 ROUND_UNNECESSARY
- 2.5 BigDecimal中的除
- 2.5 BigDecimal舍入模式枚举说明
1、简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
项目中一般涉及到金额的数据,都会用到BigDecimal。 我是喜欢在保留几位小数的时候用到,这个主要看个人习惯。
2、常用API方法
2.1 BigDecimal创建的几种方式
BigDecimal bigDecimal1 = new BigDecimal("3.14");
BigDecimal bigDecimal2 = new BigDecimal(314);
BigDecimal bigDecimal3 = new BigDecimal(314L);
BigDecimal bigDecimal4 = new BigDecimal(3.14);
System.out.println(bigDecimal1);
System.out.println(bigDecimal2);
System.out.println(bigDecimal3);
System.out.println(bigDecimal4);
BigDecimal zero = BigDecimal.ZERO;
BigDecimal one = BigDecimal.ONE;
BigDecimal ten = BigDecimal.TEN;
2.2 BigDecimal和其他类型之间的转换
2.2.1、BigDecimal转double
BigDecimal latitude = 3.1415926;
double latitudeDou = latitude.doubleValue()
2.2.2、double转BigDecimal
#方式1
double dou = 3.1415926;
BigDecimal latitude = BigDecimal.valueOf(dou);
#方式2 不推荐,会丢失精度问题
BigDecimal bigDecimal = new BigDecimal(3.1415926);
2.2.3、字符串转BigDecimal
BigDecimal bigDecimal = new BigDecimal("1.2");
System.out.println(bigDecimal);
2.2.4、int和long转BigDecimal
BigDecimal decimalLong = new BigDecimal(12L);
System.out.println(decimalLong);
BigDecimal decimalInt = new BigDecimal(12);
System.out.println(decimalInt);
2.2.5、BigDecimal转int和long
BigDecimal decimalLong = new BigDecimal(12L);
System.out.println(decimalLong.longValue());
BigDecimal decimalInt = new BigDecimal(12);
System.out.println(decimalInt.intValue());
2.3 BigDecimal中的加减乘
先说下加减乘,除法在了解舍入模式后在说。
1、add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal ten = BigDecimal.TEN;
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal add = bigDecimal.add(ten).add(bigDecimal1);
System.out.println(add);
2、subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal subtract = bigDecimal1.subtract(bigDecimal);
System.out.println(subtract);
3、multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal multiply = bigDecimal1.multiply(bigDecimal);
System.out.println(multiply);
2.4 BigDecimal中的舍入模式
舍入模式就是在遇到小数时怎么保留,最常见的就是四舍五入。
2.4.1 ROUND_CEILING
ROUND_CEILING表示向正无穷方向舍入。下面参数1代表保留一位小数,只要后面有两位小数,前方就会加1。 如果参数为2,结果就是3.15。如果参数为0,结果就是4。
BigDecimal bigDecimal = new BigDecimal("3.141");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_CEILING);
System.out.println(scale);
2.4.2 ROUND_DOWN
ROUND_DOWN向零方向舍入。下面参数为1时,结果3.9。如果参数为2,结果就是3.91。如果参数为0,结果就是3。
BigDecimal bigDecimal = new BigDecimal("3.912");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_DOWN);
System.out.println(scale);
2.4.3 ROUND_HALF_UP
ROUND_HALF_UP这个就是我们常说的“四舍五入”,也是用的最多的一个。
BigDecimal bigDecimal = new BigDecimal("3.661");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(scale);
2.4.4 ROUND_UNNECESSARY
ROUND_UNNECESSARY表示计算结果是精确的,不需要舍入模式。
2.5 BigDecimal中的除
4、divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
BigDecimal divide = new BigDecimal(10).divide(new BigDecimal(2));
System.out.println(divide);
注意:在进行除法运算时,结果如果有小数,会报错误:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数。
divide(BigDecimal,保留小数点后几位小数,舍入模式)
BigDecimal divide = new BigDecimal(10).divide(new BigDecimal(3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
2.5 BigDecimal舍入模式枚举说明
可以发现,下面舍入模式写法是不一样的BigDecimal.ROUND_HALF_UP和RoundingMode.HALF_UP。点进去源码可以看到,枚举RoundingMode.HALF_UP中定义的就是BigDecimal.ROUND_HALF_UP。 所以这两个写法表示的是同一个东西
BigDecimal divide1 = new BigDecimal(10).divide(new BigDecimal(3), 2, RoundingMode.HALF_UP);
BigDecimal divide2 = new BigDecimal(10).divide(new BigDecimal(3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide1+"---"+divide2);