BigDecimal减法

时间:2015-09-13 05:15:25

标签: java bigdecimal

我想减去2 double个值,我尝试了以下代码。

double val1 = 2.0;
double val2 = 1.10;

System.out.println(val1 - val2);

我得到了输出,

0.8999999999999999

为了获得0.9输出,我尝试使用BigDecimal,如下所示,

BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);

System.out.println(val1BD.subtract(val2BD));

我得到了输出,

0.899999999999999911182158029987476766109466552734375

然后我尝试了BigDecimal.valueOf()

val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);

System.out.println(val1BD.subtract(val2BD));

最后我得到了0.9的输出。

我的问题是案例2和案例之间有什么区别?案例3?

在案例2中为什么我得到这样的输出?

2 个答案:

答案 0 :(得分:8)

BigDecimal.valueOf(double d)使用内部String的双值的规范Double.toString(double)表示,这就是您在第二种情况下获得0.9的原因。

  

注意:这通常是转换double(或者)的首选方法   浮动)到BigDecimal,因为返回的值等于   从使用结果构造BigDecimal得到的结果   Double.toString(double)

使用new BigDecimal(0.9)时,它会将值转换为double值的精确浮点表示,而不使用String表示,

  

将双精度转换为BigDecimal,这是精确的小数   表示double的二进制浮点值。

     

<强> ...

     

注意:

     
      
  1. 此构造函数的结果可能有些不可预测。
  2.         

    <强> ...

例如:

BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);

输出:

0.9
0.90000000000000002220446049250313080847263336181640625

答案 1 :(得分:0)

对于那些来到这里寻找BigDecimal的其他问题的人(与上面的问题无关)... 请记住为方法提供mathContext以避免某些问题,例如

        MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
        BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
        BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);