如何在基础Java中让平方根计算循环在指定小数位后停止?
嘿,我来帮你搞定这个平方根计算时的无限循环问题!
你的问题核心在于:当输入不是完全平方数时,迭代出来的平方根永远没法和真实值完全相等,要是循环终止条件盯着“结果的平方等于输入数”,那程序肯定会一直跑下去。解决思路很简单——给循环加个精度停止线:当迭代结果的变化小到不会影响你想要的小数位数时,就停止循环。
比如你想保留4位小数,那可以把精度阈值设成0.00005(这样哪怕最后一位有微小误差,四舍五入后也能保证4位小数的准确性)。下面是修改后的完整代码,我用了常用的牛顿迭代法(高效又好理解),同时加入了精度控制:
import java.util.Scanner; public class SquareRootMethod { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Please enter a number to calculate its square root:"); double num = sc.nextDouble(); sc.close(); // 先处理负数的情况,避免无效计算 if (num < 0) { System.out.println("Square root of negative number is not a real number."); return; } // 初始化第一个猜测值,一般取输入数的一半就行 double guess = num / 2; // 设定精度:比如要保留4位小数,阈值设为0.00005 // 公式是 0.5 * 10^(-小数位数) double precision = 0.00005; double previousGuess; do { previousGuess = guess; // 牛顿迭代的核心公式,用来更新猜测值 guess = (guess + num / guess) / 2; // 终止条件:两次猜测的差的绝对值小于设定的精度时,停止循环 } while (Math.abs(guess - previousGuess) > precision); // 格式化输出到指定的小数位数,这里是4位 System.out.printf("Square root of %.2f is %.4f%n", num, guess); } }
几个关键细节:
- 精度阈值怎么选:如果要保留
n位小数,阈值就设为0.5 * 10^(-n)。比如保留3位小数就是0.0005,这样能确保最终结果四舍五入后符合你的要求。 - 为什么不用等于判断:浮点数的
==判断本来就不靠谱,尤其是非完全平方数的情况,永远不会有完全相等的时刻,所以必须用“差值小于精度”来做终止条件。 - 额外优化:加了负数判断,避免程序处理无意义的负数平方根计算。
如果你原本用的是其他迭代方法(比如二分法),原理也是一样的——把终止条件换成“当前结果和真实值的差小于精度阈值”就可以啦。
内容的提问来源于stack exchange,提问作者Sahib Saini
相关产品推荐
相关产品推荐

