java精确除法运算-BigDecimal
⼀、BigDecimal介绍
Java中提供了⼤数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,⽤于⾼精度计算.
  其中 BigInteger 类是针对⼤整数的处理类,⽽ BigDecimal 类则是针对⼤⼩数的处理类.
  BigDecimal 类的实现⽤到了 BigInteger类,不同的是 BigDecimal 加⼊了⼩数的概念.
  float和Double只能⽤来做科学计算或者是⼯程计算;在商业计算中,对数字精度要求较⾼,必须使⽤ BigInteger 类和 BigDecimal 类,它⽀持任何精度的定点数,可以⽤它来精确计算货币值.
  BigDecimal类创建的是对象,不能使⽤传统的+、-、*、/等算术运算符直接对其进⾏数学运算,⽽必须调⽤其对应的⽅法.⽅法的参数也必须是BigDecimal类型的对象.
⼆、构造BigDecimal 对象常⽤⽅法以及转换为基本数据类型⽅法
2.1构造BigDecimal 对象常⽤⽅法
1、⽅法⼀
BigDecimal BigDecimal(double d); //不允许使⽤
  2、⽅法⼆
BigDecimal BigDecimal(String s); //常⽤,推荐使⽤
3、⽅法三
static BigDecimal valueOf(double d); //常⽤,推荐使⽤
注意:
  1. double 参数的构造⽅法,不允许使⽤因为它不能精确的得到相应的值,值会变⼤;
  2. String 构造⽅法是完全可预知的: 写⼊ new BigDecimal(“0.1”) 将创建⼀个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使⽤ String 构造⽅法;
  3. 静态⽅法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的⾸选⽅法;
2.2 换为基本数据类型⽅法
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
三、BigDecimal对象的常⽤⽅法
1.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。
2.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。
3.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。
4.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。
5.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。
6.BigDecimal max(BigDecimal value):最⼤数,求两个BigDecimal类型数据的最⼤值。
7.BigDecimal min(BigDecimal value):最⼩数,求两个BigDecimal类型数据的最⼩值。
8.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。
9.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。
四、除法运算的函数可以指定⼩数点后保留位数和取舍规则
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
除法 divide有三个参数的⽅法,第⼀参数表⽰除数,第⼆个参数表⽰⼩数点后保留位数,第三个参数表⽰取舍规则。只有在作除法运算或四舍五⼊时才⽤到取舍规则。 因为BigDecimal除法可能出现不能整除的情况,⽐如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。所以当我们⽤三参数的除法⽅法时,规定了保留⼏位⼩数以及你的保留⽅式,就可以避免异常。
ROUND_CEILING:舍位时往正⽆穷⽅向移动
正数:1.1 -> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -1 -1.5-> -1 -1.8-> -1
ROUND_DOWN:向0的⽅向移动
正数:1.1-> 1 1.5-> 1 1.8-> 1
负数:-1.1-> -1 -1.5-> -1 -1.8> -1
ROUND_FLOOR:与CEILING相反,往负⽆穷
正数: 1.1-> 1 1.5-> 1 1.8-> 1
负数: -1.1-> -2 -1.5-> -2 -1.8-> -2
ROUND_HALF_DOWN:以5为分界线,或⽈五舍六⼊
正数:1.5-> 1 1.6-> 2
负数:-1.5-> -1 -1.6-> -2
ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前⼀位变偶数
1.15-> 1.2 1.16-> 1.2 1.25-> 1.2 1.26-> 1.3
ROUND_HALF_UP:最常见的四舍五⼊
ROUND_UNNECESSARY:⽆需舍位
ROUND_UP与ROUND_DOWN相反,远离0的⽅向
正数:1.1-> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -2 -1.5-> -2 -1.8-> -2
四、如果你想格式化⼩数
4.1BigDecimal.setScale()⽅法⽤于格式化⼩数点
参数⼀:保留的⼩数位数 参数⼆:取舍规则是必须的
public class TestBigDecimal {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("123.564");
b1.setScale(2);
System.out.println(b1);
}
}
异常:
bigdecimal除法保留小数
Exception in thread “main” java.lang.ArithmeticException: Rounding necessary
4.2除法的使⽤
public class TestBigDecimal {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("123.564");
BigDecimal b2 = new BigDecimal("3.3");
BigDecimal divide = b1.divide(b2, 10, RoundingMode.HALF_UP);
System.out.println(divide);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。