如何使用Java基于给定级数公式计算圆周率π并处理奇次幂减法
基于给定级数计算圆周率的Java实现修正
𝜋 = √12 × (1/(1×3⁰) - 1/(3×3¹) + 1/(5×3²) - 1/(7×3³) + ........)
原代码存在的问题
你原本的符号判断逻辑(n为偶数加、奇数减)是正确的,其他部分存在几处错误导致无法得到正确结果:
- 冗余双重循环:该级数每一项的
k值和n是一一对应的,关系为k = 2n + 1,不需要额外嵌套循环遍历k - 内层循环逻辑错误:循环终止条件
k<=k恒成立,会触发死循环;步长写法k =+ 2是错误语法,等价于k = 2,无法实现每次加2的效果 - 公式计算逻辑错误:原公式中
3ⁿ是分母项,原代码写为分子乘法,会导致计算结果完全偏离预期 - 整数除法问题:Java中整数相除默认返回整数,
1/k如果k是int类型,当k>=2时结果会是0,需要触发浮点运算
修正后代码
public static double calculatePi(int iterateTimes){ double sum = 0; for (int n = 0; n <= iterateTimes; n++) { // 计算当前项的参数 double k = 2 * n + 1; double pow3 = Math.pow(3, n); double sign = n % 2 == 0 ? 1 : -1; // 累加当前项 sum += sign / (k * pow3); } final double SQRT_12 = Math.sqrt(12); return SQRT_12 * sum; }
使用时输入迭代次数iterateTimes即可,数值越大计算结果精度越高,迭代到100次时精度已经可以满足绝大多数普通场景使用。
内容的提问来源于stack exchange,提问作者NSD
相关产品推荐
相关产品推荐

