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

Python二次方程计算器问题:解错误与根格式优化需求

问题解决:二次方程计算器的两个核心问题

一、求根结果错误的修复

你当前的求根函数存在两个致命错误,导致x²-2x+1和x²+2x+1的根计算结果一致:

  1. 错误处理了b的符号:用-abs(b)替代公式中的-b,不管输入的b是正还是负都强行转为负数,完全违背求根公式逻辑。比如x²-2x+1(b=-2),正确的-b是2,但代码计算成-abs(-2)=-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函数存在逻辑顺序错误和符号处理问题,导致无法正确优化显示格式:

  1. 判断顺序颠倒:先判断实部是否为0并直接返回,忽略了虚部的存在;实部判断会覆盖虚数根的处理,比如1+2i会被当成实根处理。
  2. 符号处理不彻底:实部为负数时未取绝对值拼接减号,无法实现(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:43:19