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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:02