用Java精确地乘以两个数字

时间:2017-08-13 17:59:08

标签: java bigdecimal

我正在寻找一种在Java中乘以两个浮点数的精确方法,我读到我应该使用BigDecimal,但它不能按预期工作。我做错了什么?

我的代码:

BigDecimal a = new BigDecimal(3.53);
BigDecimal b = new BigDecimal(3.59);
BigDecimal c = a.multiply(b);

System.out.println(c);

结果:

12.672699999999998796873512674210388041622697702955394242845497954075284496866515837609767913818359375

预期结果:

12.6727

1 个答案:

答案 0 :(得分:12)

当您使用BigDecimal(double)构造函数时,它不能比double更精确,请改用String表单。像,

BigDecimal a = new BigDecimal("3.53");
BigDecimal b = new BigDecimal("3.59");
BigDecimal c = a.multiply(b);
System.out.println(c);

哪个输出

12.6727

链接的Javadoc部分说 -

  

注意:

     
      
  1. 此构造函数的结果可能有些不可预测。有人可能会认为在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它正好等于0.1(未缩放的值为1,标度为1),但它实际上等于{{1} }。这是因为0.1不能精确地表示为0.1000000000000000055511151231257827021181583404541015625(或者,就此而言,作为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管有外观。

  2.   
  3. 另一方面,String构造函数是完全可预测的:写double创建一个BigDecimal,其完全等于0.1,正如人们所期望的那样。因此,通常建议优先使用String constructor

  4.