一、前言
Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四种基础计算。
二、内容
(一)BigDecimal 加法运算——add()方法
// int类型
BigDecimal bigInt1 = new BigDecimal(6);
BigDecimal bigInt2= new BigDecimal(8);
//BigDecimal求和
System.out.println("和 :" + bigInt1 .add(bigInt2));
// 打印输出:和 :14
// Double类型
BigDecimal bigDouble1= new BigDecimal(6.6);
BigDecimal bigDouble2= new BigDecimal(8.8);
//BigDecimal求和
System.out.println("和:" + bigDouble1.add(bigDouble2) );
// 打印输出:和 :15.4000000000000003552713678800500929355621337890625
和 :14
和 :服务器托管网15.4000000000000003552713678800500929355621337890625
double类型的输出的结果与我们心中所想是不是不太一样?
原因: double不能表示为任何有限长度的二进制小数,所以会出现丢失精度问题。String、int 不会丢失精度
解决方法: 官方文档中建议使用字符串形式,这样不会丢失精度。
// String类型
BigDecimal bigString1 = new BigDecimal("6.6");
BigDecimal bigString2 = new BigDecimal("8.8");
//BigDecimal求和
System.out.println("和 :" +bigString1.add(bigString2));
// 打印输出:和 :15.4
(二)BigDecimal 减法运算——subtract()方法
BigDecimal bigString1 = new BigDecimal("8.8");
BigDecimal bigString2= new BigDecimal("6.6");
//BigDecimal求差
System.out.println("差 :" +bigString1.subtract(bigString2) );
// 打印输出:差 :2.2
(三)BigDecimal 乘法运算——multiply()方法
B服务器托管网igDecimal bigString1= new BigDecimal("8.8");
BigDecimal bigString2= new BigDecimal("6.6");
//BigDecimal求积
System.out.println("积 :" +bigString1.multiply(bigString2));
// 打印输出 积 :58.08
(四)BigDecimal 除法运算——divide()方法
BigDecimal bigString1= new BigDecimal("24.6");
BigDecimal bigString2= new BigDecimal("2");
//BigDecimal求商
System.out.println("商 :" +bigString1.divide(bigString2));
// 打印输出: 商 :12.3
除法运算注意:
1、除数不可为0,否则报错:Division by zero
2、不要出现除不尽的情况,尽量保留一定的小数点位数,比方10/3,则会报错:Non-terminating decimal expansion; no exact representable decimal result.
除法计算保留两位小数,并四舍五入
BigDecimal bigString1= new BigDecimal("10");
BigDecimal bigString2= new BigDecimal("3");
//BigDecimal求商
System.out.println("商 :" +bigString1.divide(bigString2, 2, RoundingMode.HALF_UP));
// 打印输出: 商 :商 :3.33
java.math.RoundingMode:这是一种枚举类型,它定义了8种数据的舍入模式。它与java.math.BigDecimal类中定义的8个同名静态常量的作用相同,具体介绍可看源码或源码示例
三、BigDecimal(舍入模式)
它定义了8种数据的舍入模式,如下
1、ROUND_UP:向远离零的方向舍入。
若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。
2、ROUND_DOWN:向接近零的方向舍入。
不论舍入位是否为零,都直接舍弃。即为向内取整模式。
3、ROUND_CEILING:向正无穷大的方向舍入。
若 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;若为负,则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。
4、ROUND_FLOOR:向负无穷大的方向舍入。
若 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;若为负,则舍入行为与 ROUND_UP 相同。即为向下取整模式。
5、ROUND_HALF_UP:向“最接近的”整数舍入。
若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
6、ROUND_HALF_DOWN:向“最接近的”整数舍入。
若舍入位大于5,则对舍入部分的前一位数字加1;若舍入位小于等于5,则直接舍弃。即为五舍六入模式。
7、ROUND_HALF_EVEN:向“最接近的”整数舍入。
若(舍入位大于5)或者(舍入位等于5且前一位为奇数),则对舍入部分的前一位数字加1;
若(舍入位小于5)或者(舍入位等于5且前一位为偶数),则直接舍弃。即为银行家舍入模式。
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-30-处理日历时间控件-下篇
1.简介 理想很丰满现实很骨感,在应用playwright实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就有点难了或者是有些复杂啰嗦而且麻烦不过相对于sele…