Java 精确计算黄金比例,精确到小数点后20位
黄金分割率是一种特殊的比率,它与生物体各部分不同维度之间的比率有关 从数学上讲,可以通过以下公式找到:Java 精确计算黄金比例,精确到小数点后20位,java,decimal,calculator,Java,Decimal,Calculator,黄金分割率是一种特殊的比率,它与生物体各部分不同维度之间的比率有关 从数学上讲,可以通过以下公式找到: (1+平方根(5))/2) 通过使用任何类型的数据类型,我都无法存储这样的值double是最好的,但是我用它不能得到20个小数位 所以,我想,如果我能在计算后找到比率的最后几位,然后把它存储在某个变量中,然后继续这样做。最后,我可以通过一个接一个地加入小数位来完成它 示例:从1.61083中,我将提取3,0,8,0,1,6并加入它 但我仍然有问题,因为即使在计算过程中,它也没有使用如此精确的变
(1+平方根(5))/2) 通过使用任何类型的数据类型,我都无法存储这样的值
double
是最好的,但是我用它不能得到20个小数位
所以,我想,如果我能在计算后找到比率的最后几位,然后把它存储在某个变量中,然后继续这样做。最后,我可以通过一个接一个地加入小数位来完成它
示例:从1.61083中,我将提取3,0,8,0,1,6并加入它
但我仍然有问题,因为即使在计算过程中,它也没有使用如此精确的变量
有人能帮忙吗?这是你的方法
BigDecimal.ONE.add(new BigDecimal(Math.sqrt(5))).divide(new BigDecimal(2))
表示已发布的公式,将返回1.618033987498949025257388711906969547271728515625
也就是说,直到小数点后49位,您可以使用@Philipp提到的
java.math.BigDecimal
。但是您将面临的下一个问题是java不为大小数提供sqrt函数。这就是你的出路。我在某个地方找到了这段代码,它可以帮助您计算任意精度的大小数的sqrt
public static BigDecimal sqrt(BigDecimal d, int precison) {
BigDecimal TWO =BigDecimal.valueOf(2);
MathContext mc = new MathContext(precison);
BigDecimal res = BigDecimal.ONE;
for(int i=1;i<=precison;i++) {
res = res.add(d.divide(res,mc)).divide(TWO,mc);
}
return res;
}
公共静态BigDecimal sqrt(BigDecimal d,int-precison){
BigDecimal 2=BigDecimal.valueOf(2);
MathContext mc=新的MathContext(精度);
BigDecimal res=BigDecimal.1;
对于(int i=1;i用于计算平方根:
BigDecimal five = new BigDecimal(5);
BigDecimal two = new BigDecimal(2);
BigDecimal x = new BigDecimal(Math.sqrt(five.doubleValue()));
BigDecimal sqrt_five = x.add(new BigDecimal(five.subtract(x.multiply(x)).doubleValue() / (x.doubleValue() * 2.0)));
System.out.println(BigDecimal.ONE.add(sqrt_five).divide(two));
你得到:1.618033987498948482045868343656416263709228373950664136429054637081326184500085219042375683784486328125
希望能有所帮助。研究BigDecimal
会有帮助吗?相关:我在回答中添加了一个公式的实现。根据这一点,我的代码片段更精确:除了编写一个近似平方根的方法外,还可以依赖这样一个事实,即如果x是黄金平均值的近似值,(x+1)/x将是黄金分割的更好近似值。Sanjeev,你错了,java中有sqrt函数。请编辑你的post@Shubhamsqrt函数在那里,但是没有一个是直接用于bigdecimal的,有一次我需要一个bigdecimal sqrt,最多100个小数位,这个函数起到了帮助作用。