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

如何在C#中不使用math.sqrt()实现平方根?小数输入无响应问题求助

问题修复方案

问题根源

  • 输入类型限制:原代码将输入强制转为int,直接丢弃小数部分,导致小数输入无法被正确解析,甚至触发类型转换异常。
  • 负数输入引发死循环:当输入负数时,number为负整数,循环终止条件i == number + 1会变成i == 负数+1(例如输入-1时条件为i == 0),但i从0开始递增,永远无法满足该条件,导致程序进入死循环无响应。
  • 迭代终止逻辑错误:依赖输入值的大小来终止迭代,而非计算精度,对小数值计算完全失效,结果也不准确。

修复后的代码

private void btnCalc_Click(object sender, EventArgs e)
{
    // 尝试解析输入为double类型,处理非法输入
    if (!double.TryParse(txtNumber.Text, out double number))
    {
        MessageBox.Show("Please enter a valid number");
        return;
    }

    // 处理负数输入,弹出指定提示
    if (number < 0)
    {
        MessageBox.Show("Please enter a positive number");
        return;
    }

    double root = 1;
    double precision = 1e-10; // 设定精度阈值,控制迭代终止时机
    double previousRoot;

    // 巴比伦平方根迭代法,基于精度差终止循环
    do
    {
        previousRoot = root;
        root = (number / root + root) / 2;
    } while (Math.Abs(root - previousRoot) > precision);

    lbResult.Text = root.ToString();
}

修复说明

  • 支持小数输入:通过double.TryParse将输入转为double类型,完整保留小数部分,确保小数值能被正确计算。
  • 避免死循环与错误提示:添加负数判断,及时弹出要求输入正数的提示并终止流程,彻底解决负数输入导致的死循环问题。
  • 精准的迭代终止:改用计算结果的精度差作为终止条件,当两次迭代结果的差值小于1e-10时停止,既保证计算结果的准确性,又不会出现无限制迭代的情况。
  • 异常安全:使用TryParse替代强制转换,避免因输入非数字字符串引发的程序异常。

内容的提问来源于stack exchange,提问作者Mac Laurore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:43