一、BigDecimal 简介
BigDecimal 类位于 java.math 包中,它提供了更加精确的算术运算,使用户完全控制舍入行为。 如果未指定舍入模式,并且无法表示确切的结果,则抛出异常; 否则,可以通过操作提供适当的 MathContext 对象来进行计算,以选择精度和舍入模式。虽然双精度浮点型变量 double 可以处理16位有效数,但在实际应用中可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字我们可以直接使用 Float 或 Double 处理,但是 Double.valueOf(String) 和Float.valueOf(String) 会丢失精度。如果我们需要精确计算的结果,则必须使用BigDecimal 类来操作。
【注】使用 BigDecimal 进行计算时,我们不能再使用算术运算符(+、-、*、/)进行算数运算,而是使用 BigDecimal 类提供的 add、subtract、multiply、divide 等方法来进行算数运算。
我们这篇讲讲小编在使用BigDecimal中使用ROUND_HALF_UP进行精度遇到的问题。
我们先看下面这段代码的输出:
BigDecimal bigDecimal=new BigDecimal(3.845);System.out.println(bigDecimal);System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP));BigDecimal bigDecimal2=new BigDecimal(0.845);System.out.println(bigDecimal2);System.out.println(bigDecimal2.setScale(2,BigDecimal.ROUND_HALF_UP));
输出的结果:
我们可以看到,3.845四舍五入的结果是3.85,0.845四舍五入的结果是0.84。
原因:使用参数为float或double的BigDecimal创建对象会丢失精度。因此强烈建议不要使用参数为float或double的BigDecimal创建对象。
解决办法:
- 使用BigDecimal(String val)的构造方法创建对象
new BigDecimal(“3.845”);
new BigDecimal(“0.845”); - 使用使用BigDecimal的valueOf(double val)方法创建对象
BigDecimal.valueOf(3.845);
BigDecimal.valueOf(0.845);