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

如何编写C#二次方程求解器?已实现代码但计算结果错误

问题分析与修复方案

我帮你梳理一下代码里的几个关键问题,这些都是导致结果错误的核心原因:

  • 变量重复声明:你一开始声明了double p, q;,后面又重新用int p = ...和int q = ...定义同名变量,这会直接触发编译错误——同一作用域内不能重复定义变量。而且二次方程的根大概率是小数,建议直接用double类型存储p和q的值。
  • 误用运算符:在C#里,^是按位异或运算符,根本不是用来计算平方的!要算平方,要么用Math.Pow(p/2, 2),要么用更高效的(p/2) * (p/2)。
  • 整数除法精度丢失:如果p是整数类型,p/2会执行整数除法(比如p=5时,5/2会得到2而非2.5),这会严重拉低计算结果的精度,必须确保运算时是浮点除法。
  • 未处理判别式为负的情况:如果(p/2)*(p/2) - q小于0,Math.Sqrt会返回NaN,程序会输出异常结果,建议先判断判别式的正负,处理复数根的情况。

下面是修复后的完整代码:

double p, q;
Console.Write("Insert the value of p: ");
// 直接转成double,避免整数除法问题
p = double.Parse(Console.ReadLine());
Console.Write("Insert the value of q: ");
q = double.Parse(Console.ReadLine());

double discriminant = (p / 2) * (p / 2) - q;
if (discriminant >= 0)
{
    double sqrtDiscriminant = Math.Sqrt(discriminant);
    double x1 = -p / 2 + sqrtDiscriminant;
    double x2 = -p / 2 - sqrtDiscriminant;
    Console.WriteLine($"x1 = {x1:F2}"); // 保留两位小数输出,结果更清晰
    Console.WriteLine($"x2 = {x2:F2}");
}
else
{
    // 处理复数根的场景
    double realPart = -p / 2;
    double imaginaryPart = Math.Sqrt(-discriminant);
    Console.WriteLine($"x1 = {realPart:F2} + {imaginaryPart:F2}i");
    Console.WriteLine($"x2 = {realPart:F2} - {imaginaryPart:F2}i");
}

你可以测试一下这个版本,比如输入p=-4、q=3,应该得到x1=3、x2=1,修复后的代码会正确输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:24:59