这个BigDecimal计算有什么问题吗?

时间:2014-05-12 14:45:37

标签: java bigdecimal

我是BigDecimal的新手 我尝试使用Java代码进行一些数学计算。当我使用Google计算器尝试相同的计算时,它会给我一个稍微不同的结果。哪一个最准确?如果谷歌计算器更准确,那么如何改进java代码来匹配呢?

在Google计算器上:

134.23576185216913 - (134.23576185216913×√(1 - (200000000 ^ 2÷299800000 ^ 2)))= 34.2357618522

关于Java:

      BigDecimal t1 = new BigDecimal(134.23576185216913);
      BigDecimal one = new BigDecimal(1);
      BigDecimal speed = new BigDecimal(200000000).pow(2);
      BigDecimal lightsSpeed = new BigDecimal(299800000).pow(2);

      MathContext mc = new MathContext(2, RoundingMode.HALF_UP);
      System.out.println(t1.subtract((t1.multiply(SquareRoot.bigSqrt(one.subtract(speed.divide(lightsSpeed,mc)))))));

bigSqrt的方法来自here

结果是:

运行: 的 34.683856455950090090043113321827989040137639817587194953722595479211000578082422197809603912048352550091209304856567024386365147605287692511973841869226169664820176852861655846233912503305984796190828666994508412096618025960010635831985100961879858807909056676663493607611105279976694118991120829708264297254294821755138400476425886154174804687500
建立成功(总时间:0秒)

2 个答案:

答案 0 :(得分:7)

这是你的问题:

MathContext mc = new MathContext(2, RoundingMode.HALF_UP);

你将分区四舍五入到小数点后两位。改为使用MathContext mc = new MathContext(15, RoundingMode.HALF_UP);(例如),你应该得到更接近预期结果的东西。

你可以看到与以下区别:

System.out.println(speed.divide(lightsSpeed,new MathContext(2, RoundingMode.HALF_UP)));
System.out.println(speed.divide(lightsSpeed,new MathContext(15, RoundingMode.HALF_UP)));

打印:

  

0.45
  0.445037630156818

答案 1 :(得分:0)

对于我来说,数学上和数据结构方面发生的事情有点不清楚。据我所知,BigDecimal只能代表某些有理数,绝不是任意平方根。 SquareRoot中的链接方法将返回实际平方根的一些近似值,这似乎也是对代码进行表面检查的情况。