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

C#控制台方程求解程序出现NaN及异常问题求助

问题分析与修复方案

问题根源

1. x1显示NaN

当输入a=0时,方程实际是一次方程(bx + c = 0),但原代码仍按二次方程逻辑计算x1 = (-b + Math.Sqrt(D)) / (2.0 * a),此时2.0 * a = 0,若分子非0会得到无穷大,分子为0则得到NaN,导致输出异常。

2. 修改x1/x2类型后进入catch块

若将x1、x2改为整数类型(如long),计算时除以0会触发DivideByZeroException,被catch块捕获。而原代码的catch块未区分异常类型,直接输出错误信息,忽略了一次方程的合法解。


修复后的代码

static void Main(string[] args)
{
    long a, b, c;
    double x1, x2, D;
    Console.WriteLine("Write the numbers a, b, c: ");
    
    // 单独处理输入解析异常
    try
    {
        string[] parts = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries);
        a = long.Parse(parts[0]);
        b = long.Parse(parts[1]);
        c = long.Parse(parts[2]);
    }
    catch (FormatException)
    {
        Console.WriteLine("Invalid input: please enter three integers separated by spaces.");
        return;
    }
    catch (IndexOutOfRangeException)
    {
        Console.WriteLine("Invalid input: please enter exactly three numbers.");
        return;
    }

    try
    {
        // 优先处理一次方程场景
        if (a == 0)
        {
            if (b == 0)
            {
                Console.WriteLine(c == 0 ? "x - any number" : "there are no solutions");
            }
            else
            {
                // 一次方程求解:bx + c = 0 → x = -c/b
                double x = (double)-c / b;
                Console.WriteLine($"x = {x}");
            }
            return;
        }

        // 二次方程逻辑
        D = Math.Pow(b, 2) - 4 * a * c;
        if (D > 0)
        {
            x1 = (-b + Math.Sqrt(D)) / (2.0 * a);
            x2 = (-b - Math.Sqrt(D)) / (2.0 * a);
            Console.WriteLine($"x1 = {x1}, x2 = {x2}");
        }
        else if (D == 0)
        {
            x1 = (-b) / (2.0 * a); // 用2.0*a确保浮点除法
            Console.WriteLine($"x1 = x2 = {x1}");
        }
        else
        {
            Console.WriteLine("there are no real roots");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Unexpected error: {ex.Message}");
    }
}

关键修改点

  • 拆分输入与业务逻辑:将输入解析的异常单独捕获,明确提示输入错误,避免与计算异常混淆。
  • 优先处理一次方程:先判断a=0的情况,直接按一次方程逻辑计算,避免进入二次方程的无效计算。
  • 修复除法精度:二次方程重根计算中使用2.0 * a确保浮点除法,避免整数除法导致的精度丢失。
  • 精准异常处理:catch块仅处理意外异常,不再误判合法的一次方程场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:39