Python二次方程计算器问题:解错误与根格式优化需求
问题解决:二次方程计算器的两个核心问题
一、求根结果错误的修复
你当前的求根函数存在两个致命错误,导致x²-2x+1和x²+2x+1的根计算结果一致:
- 错误处理了
b的符号:用-abs(b)替代公式中的-b,不管输入的b是正还是负都强行转为负数,完全违背求根公式逻辑。比如x²-2x+1(b=-2),正确的-b是2,但代码计算成-abs(-2)=-2,直接导致根的符号错误。 - 运算顺序错误:求根公式的分母是
2a,但代码写的是/2*a,会先除以2再乘以a,等价于(结果)*a/2,和正确的/(2*a)完全不同。
修正后的求根函数:
def qfpositive(a, b, c): return (-b + cmath.sqrt(b**2 - 4*a*c)) / (2*a) def qfnegative(a, b, c): return (-b - cmath.sqrt(b**2 - 4*a*c)) / (2*a)
二、根的格式化显示修复
format_solution函数存在逻辑顺序错误和符号处理问题,导致无法正确优化显示格式:
- 判断顺序颠倒:先判断实部是否为0并直接返回,忽略了虚部的存在;实部判断会覆盖虚数根的处理,比如
1+2i会被当成实根处理。 - 符号处理不彻底:实部为负数时未取绝对值拼接减号,无法实现
(x - 1)替代(x + -1)的效果。
修正后的格式化函数:
def format_solution(root): # 处理实根(虚部为0的情况) if root.imag == 0: real_part = round(root.real, 6) # 保留6位小数避免浮点误差 if real_part == 0: return "(x)" elif real_part > 0: return f"(x - {real_part})" else: return f"(x + {abs(real_part)})" # 处理虚根 else: real_part = round(root.real, 6) imag_part = round(root.imag, 6) part_list = [] # 实部处理 if real_part != 0: sign = "-" if real_part > 0 else "+" part_list.append(f"{sign} {abs(real_part)}") # 虚部处理 sign = "+" if imag_part > 0 else "-" part_list.append(f"{sign} {abs(imag_part)}i") # 拼接并去除开头多余的+号 combined = ' '.join(part_list).lstrip('+ ') return f"(x {combined})"
完整修正代码
import cmath print('Follow this format: Ax^2 + Bx + C') a = float(input('Enter A: ')) b = float(input('Enter B: ')) c = float(input('Enter C: ')) # 修正后的求根函数 def qfpositive(a, b, c): return (-b + cmath.sqrt(b**2 - 4*a*c)) / (2*a) def qfnegative(a, b, c): return (-b - cmath.sqrt(b**2 - 4*a*c)) / (2*a) # 修正后的格式化函数 def format_solution(root): # 处理实根(虚部为0) if root.imag == 0: real_part = round(root.real, 6) if real_part == 0: return "(x)" elif real_part > 0: return f"(x - {real_part})" else: return f"(x + {abs(real_part)})" # 处理虚根 else: real_part = round(root.real, 6) imag_part = round(root.imag, 6) part_list = [] # 实部处理 if real_part != 0: sign = "-" if real_part > 0 else "+" part_list.append(f"{sign} {abs(real_part)}") # 虚部处理 sign = "+" if imag_part > 0 else "-" part_list.append(f"{sign} {abs(imag_part)}i") # 拼接并去除开头多余的+号 combined = ' '.join(part_list).lstrip('+ ') return f"(x {combined})" x1 = qfpositive(a, b, c) x2 = qfnegative(a, b, c) print(format_solution(x1)) print(format_solution(x2))
测试验证:
- 输入
x²-2x+1(A=1, B=-2, C=1),输出两个(x - 1.0),符合重根情况 - 输入
x²+2x+1(A=1, B=2, C=1),输出两个(x + 1.0),结果正确 - 输入
x²+1(A=1, B=0, C=1),输出(x + 1.0i)和(x - 1.0i),格式符合预期
内容的提问来源于stack exchange,提问作者marc77
相关产品推荐
相关产品推荐

