首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个BigDecimal计算有什么问题吗?

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

Stack Overflow用户
提问于 2014-05-12 14:45:36
回答 2查看 447关注 0票数 4

我是BigDecimal的新手。

我用Java代码尝试了一些数学计算。当我尝试使用谷歌计算器进行同样的计算时,它给出的结果略有不同。哪一个最准确?.如果Google计算器更精确,那么如何改进java代码来匹配它呢?

在Google计算器上:

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

在Java上:

代码语言:javascript
复制
      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秒)

EN

回答 2

Stack Overflow用户

发布于 2014-05-12 14:53:59

这是你的问题:

代码语言:javascript
复制
MathContext mc = new MathContext(2, RoundingMode.HALF_UP);

你的除法是小数点2位。使用MathContext mc = new MathContext(15, RoundingMode.HALF_UP);代替(例如),您应该得到更接近预期结果的东西。

您可以看到以下几个方面的不同:

代码语言:javascript
复制
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

票数 7
EN

Stack Overflow用户

发布于 2014-05-12 14:52:53

我有点不清楚在数学上和数据结构上发生了什么。据我所知,BigDecimal只能表示某些有理数,绝不是任意的平方根。SquareRoot中的链接方法将返回实际平方根的一些近似,这似乎也是从对代码的表面检查中得到的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23612135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档