You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基础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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:55:08