我是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秒)
答案 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
中的链接方法将返回实际平方根的一些近似值,这似乎也是对代码进行表面检查的情况。