fractions.Fraction 能真正避免浮点误差,但必须从构造开始杜绝 float 输入,否则精度已失;正确写法是用字符串或整数元组(如 Fraction(‘0.1’) 或 Fraction(1, 10)),与 float 运算会强制转 float 导致精度丢失。

fractions.Fraction 能真正避免浮点误差,但必须从构造开始就杜绝 float 输入,否则精度早已丢失。
构造 Fraction 时千万别传 float
这是最常见也最隐蔽的坑:用 0.1 构造 Fraction 看似合理,实则失效。因为 0.1 在二进制中本就是无限循环小数,Python 已经用 float 近似表示过一次,再转 Fraction 只是“精确地记录这个近似值”。
- ❌ 错误写法:
Fraction(0.1)→ 得到Fraction(3602879701896397, 36028797018963968)(不是 1/10) - ✅ 正确写法:
Fraction('0.1')或Fraction(1, 10)或Fraction('1/10') - 字符串构造支持小数、分数、整数形式,且能正确解析;整数元组形式最直观、最安全
算术运算后仍保持精确性,但需注意隐式类型转换
Fraction 与整数运算结果仍是 Fraction,但和 float 运算会强制转成 float,立刻丢失精度。
-
Fraction(1, 3) + Fraction(1, 6)→Fraction(1, 2)(精确) -
Fraction(1, 3) + 0.5→0.8333333333333334(变成float,精度已失) - 若需混合计算,应统一转为
Fraction:Fraction(1, 3) + Fraction(1, 2)
输出控制:避免自动约分或需要小数近似时的处理
Fraction 默认总是约分为最简形式,这通常是优点,但有时你需要保留原始分母(比如做通分演示),或需要可控的小数近似值。
立即学习“Python免费学习笔记(深入)”;
- 不约分?做不到——
Fraction内部始终维护最简形式,但你可以用nominator和denominator属性手动还原比例关系 - 要小数近似:用
float(frac)(不推荐用于后续计算),或更可控地用round(float(frac), N) - 转字符串显示:直接
str(frac)输出如'1/2';repr(frac)显示构造式Fraction(1, 2)
真正难的不是调用 Fraction,而是全程守住“不引入 float”这条线——从输入源头、中间变量、到外部交互,只要漏掉一个 float,前面所有精确性就归零。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/jiquanzatan/127241.html