Python编写solve_quadratic求解一元二次方程返回小数及报错咨询
问题原因
- 小数返回问题:Python 3中
/运算符默认执行浮点数除法,哪怕运算结果为整数也会返回带.0后缀的浮点数类型,和预期的整数结果格式不符。 - 报错问题:代码没有处理判别式
d < 0的情况,math.sqrt()仅支持对非负实数开根号,传入负数会直接抛出ValueError异常。另外代码中对b*b和4*a*c强制转int的逻辑存在隐患,如果传入的系数是浮点数,强转操作会丢失精度,导致判别式计算错误。
修复方案
- 除法如果要得到整数结果可以用
//,但更通用的做法是支持同时返回整数/浮点数/复数解,建议改用cmath模块替代math模块,支持负数开根号得到复数结果。 - 移除不必要的int强转逻辑,保证判别式计算精度。
- 新增结果格式化逻辑,当解为整数时自动转成int类型,符合预期输出格式。
修复后代码
import cmath def solve_quadratic(a, b, c): # 计算判别式,移除不必要的int强转 d = b*b - 4*a*c sol1 = (-b - cmath.sqrt(d)) / (2*a) sol2 = (-b + cmath.sqrt(d)) / (2*a) # 格式化结果:整数解转int,非整数保留原类型 def format_num(x): if x.imag == 0: real = x.real return int(real) if real.is_integer() else real return x tup = (format_num(sol1), format_num(sol2)) print(tup) return tup def main(): solve_quadratic(1, -3, 2) solve_quadratic(1, 2, 1) # 测试虚数解场景不会报错 solve_quadratic(1, 2, 5) if __name__ == "__main__": main()
运行输出
(1, 2) (-1, -1) ((-1-2j), (-1+2j))
内容的提问来源于stack exchange,提问作者DeDe
相关产品推荐
相关产品推荐

