Python如何对cmath模块返回的复数执行四舍五入操作
解决方案
报错原因
你使用cmath.sqrt计算平方根,当判别式小于0时返回的是复数类型,Python原生round()函数没有实现复数的四舍五入逻辑,同时你用的.3d是整数专属的格式化说明符,两类写法都会触发类型错误。
解决方法
方法1:直接使用复数支持的格式化符
复数原生支持f、g这类浮点数格式化说明符,不需要额外写逻辑,直接修改你的打印代码即可:
x1, x2 = quadratic_roots(a,b,c) # 保留2位小数 print(f"x_1 = {x1:.2f}") print(f"x_2 = {x2:.2f}") # 保留3位小数 print(f"x_1 = {x1:.3f}") print(f"x_2 = {x2:.3f}")
方法2:自定义复数四舍五入函数,优化实根显示
如果实根不需要显示+0.00j的虚部,可以单独写函数分别处理实部、虚部的四舍五入,加个阈值判断即可:
def round_complex(c, digits=2): # 分别对实部、虚部四舍五入 return complex(round(c.real, digits), round(c.imag, digits)) def format_quadratic_root(c, digits=2): # 虚部小于精度阈值时当作实数输出 if abs(c.imag) < 10 ** (-digits): return str(round(c.real, digits)) return str(round_complex(c, digits)) # 调用示例 print(f"x_1 = {format_quadratic_root(x1)}") print(f"x_2 = {format_quadratic_root(x2)}")
完整可运行代码
from cmath import sqrt def round_complex(c, digits=2): return complex(round(c.real, digits), round(c.imag, digits)) def format_quadratic_root(c, digits=2): if abs(c.imag) < 10 ** (-digits): return str(round(c.real, digits)) return str(round_complex(c, digits)) def quadratic_roots(a,b,c): delta = b ** 2 - 4 * a * c x_1 = (-b - sqrt(delta)) / (2 * a) x_2 = (-b + sqrt(delta)) / (2 * a) return x_1,x_2 a = float(input("Input ax^2: ")) b = float(input("Input bx: ")) c = float(input("Input c: ")) print(f"--- {a}x^2 + {b}x + {c} = 0 ----") x1, x2 = quadratic_roots(a,b,c) # 普通格式化输出 print("普通格式化结果:") print(f"x_1 = {x1:.2f}") print(f"x_2 = {x2:.2f}") # 优化实根显示的输出 print("优化显示结果:") print(f"x_1 = {format_quadratic_root(x1)}") print(f"x_2 = {format_quadratic_root(x2)}")
内容的提问来源于stack exchange,提问作者fredericoamigo
相关产品推荐
相关产品推荐

