
本文教你使用 sympy 库解析用户输入的分数表达式(如 "1/3"、"2/5" 或带空格的 " 4 / 7 "),并精确转为浮点数,避免 `float()` 直接调用导致的 `valueerror`。适用于三角函数计算、科学计算器等需要支持分数输入的 python 初学者项目。
在 Python 中,float("1/3") 会报错,因为 float() 只能解析十进制数字字符串(如 "0.333" 或 "3.14"),无法执行算术运算或解析分数表达式。而用户在三角计算器中自然希望输入 "1/3" 表示三分之一,并参与后续如 y * math.pi 的计算——这就需要一个能安全求值分数表达式的工具。
推荐使用 SymPy 库中的 parse_expr() 函数,它专为符号化、安全地解析数学表达式而设计。相比 eval()(存在严重安全风险),parse_expr() 仅支持数学子集,可防止代码注入,同时原生支持分数、π、e 等符号,结果精度高(返回 Rational 对象),再通过 .n() 方法即可获得高精度浮点近似值。
✅ 安装 SymPy(如未安装):
pip install sympy
✅ 核心用法示例:
from sympy import parse_expr
import math
# 安全解析用户输入的分数
user_input = input("Angle B (e.g., '1/3' or 'pi/4'): ") # 用户输入 '1/3'
expr = parse_expr(user_input) # 返回 Rational(1, 3),非浮点数,无精度损失
# 转为 float(用于 math.pi 等数值计算)
angle_rad = float(expr.n()) # 或直接 expr.evalf() → 0.333333333333333
result = angle_rad * math.pi
print(f"Angle B in radians: {result:.6f}") # 输出: 1.047198? 集成到你的三角计算器中(修正版 chooseradians):
from sympy import parse_expr
import math
def chooseradians():
print("1. Side Side Side \n2. Side Angle Side\n3. Angle Side Angle")
choice = input("Choose method: ").strip()
if choice == "1":
x = float(input("Side A: "))
y = float(input("Side B: "))
z = float(input("Side C: "))
sidesidesiderad(x, y, z)
elif choice == "2":
x = float(input("Side A: "))
# ✅ 安全解析分数角度输入
angle_b_str = input("Angle B (e.g., '1/3', 'pi/6'): ")
try:
angle_b_expr = parse_expr(angle_b_str)
y = float(angle_b_expr.n()) # 转为 float 供后续计算
except Exception as e:
print("❌ Invalid expression. Please enter a valid fraction or math expression (e.g., '1/2', 'pi/4').")
return
z = float(input("Side C: "))
SideAngleSiderad(x, y, z)
elif choice == "3":
angle_a_str = input("Angle A: ")
try:
x = float(parse_expr(angle_a_str).n())
except:
print("❌ Invalid Angle A.")
return
y = float(input("Side B: "))
angle_c_str = input("Angle C: ")
try:
z = float(parse_expr(angle_c_str).n())
except:
print("❌ Invalid Angle C.")
return
# AngleSideAnglerad(x, y, z)⚠️ 注意事项:
- 不要使用 eval(input(...)) —— 它会执行任意 Python 代码,存在严重安全隐患;
- decimal.Decimal("1/3") 失败是正常的,因为 Decimal 也不支持表达式解析,仅接受数字字符串;
- parse_expr() 默认支持 pi, e, sqrt, sin 等符号(需 from sympy import * 或显式导入),适合科学计算场景;
- 若仅需简单分数(不含 π 等符号),也可手动拆分 / 并计算:a, b = map(int, s.split('/')); result = a / b,但缺乏健壮性(不处理空格、负号、多层表达式等)。
? 总结: 对初学者而言,sympy.parse_expr() 是兼顾安全性、准确性和易用性的最优解。它让“用户友好输入”(如 "1/3")与“程序可靠计算”(如 * math.pi)无缝衔接,是构建教育类数学工具的基石能力。










