我是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秒)
发布于 2014-05-12 14:53:59
这是你的问题:
MathContext mc = new MathContext(2, RoundingMode.HALF_UP);你的除法是小数点2位。使用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
发布于 2014-05-12 14:52:53
我有点不清楚在数学上和数据结构上发生了什么。据我所知,BigDecimal只能表示某些有理数,绝不是任意的平方根。SquareRoot中的链接方法将返回实际平方根的一些近似,这似乎也是从对代码的表面检查中得到的结果。
https://stackoverflow.com/questions/23612135
复制相似问题