Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 精确计算黄金比例,精确到小数点后20位_Java_Decimal_Calculator - Fatal编程技术网

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个小数位,这个函数起到了帮助作用。