如何利用Python的fractions模块处理不丢失精度的分数运算?

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

如何利用python的fractions模块处理不丢失精度的分数运算?

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.50.8333333333333334(变成 float,精度已失)
  • 若需混合计算,应统一转为 FractionFraction(1, 3) + Fraction(1, 2)

输出控制:避免自动约分或需要小数近似时的处理

Fraction 默认总是约分为最简形式,这通常是优点,但有时你需要保留原始分母(比如做通分演示),或需要可控的小数近似值。

立即学习“Python免费学习笔记(深入)”;

  • 不约分?做不到——Fraction 内部始终维护最简形式,但你可以用 nominatordenominator 属性手动还原比例关系
  • 要小数近似:用 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

如何使用Python Flask开发高性能的图片压缩与水印处理接口?
上一篇 2026-07-20 08:13
下一篇 2026-07-20 08:13

相关推荐