如何编写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
相关产品推荐
相关产品推荐

