抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

简介

首先我们都知道float和dobule会产生精度的问题,这是因为他们在设计时就是为了科学计算和工程计算,在广域数值范围上提供较为精确的快速近似计算而精心设计的。但是在商业计算中就不行啦,商业计算要求计算准确,精准,你想想如果你的支付宝账户余额显示233.9999988888,那是一种怎么样的体验?这个时候BigDecimal就有用了。

pasted-62

BigDecimal构造方法

  1. BigDecimal(int)
  2. BigDecimal(double)
  3. BigDecimal(long)
  4. BigDecimal(String)

BigDecimal共有四种构造方法,但是其中构造参数为double类型的构造方法不推荐使用,为啥呢?看下面。

pasted-63

使用double类型的构造方法具有不确定性,使用string类型的构造方法就具有确定性,传的啥,创建啥。

BigDecimal的四则运算

  1. public BigDecimal add(BigDecimal value)//加法
  2. public BigDecimal subtract(BigDecimal value)//减法
  3. public BigDecimal multiply(BigDecimal value)//乘法
  4. public BigDecimal divide(BigDecimal value)//除法

pasted-64

加减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象

当divide除不尽的时候会抛出java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常。

pasted-65

因此divide可以传三个参数

  • public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
  • ROUND_UP :向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。
  • ROUND_DOWN :向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。
  • ROUND_CEILING :向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。
  • ROUND_FLOOR :向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。
  • ROUND_HALF_UP :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。
  • ROUND_HALF_DOWN :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。
  • ROUND_HALF_EVEN :向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。
  • ROUND_UNNECESSARY :断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

总结

  1. 商业计算使用BigDecimal。
  2. 尽量使用参数类型为String的构造函数。
  3. BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

参考资料

Java BigDecimal详解

java 中 BigDecimal 详解