Python 中的“分数”指 fractions.Fraction 类型,用于精确表示有理数以避免浮点精度误差;它自动约分、支持四则运算、区别于 float 和 Decimal,适用数学推导等需精确计算场景。

Python 中的“分数”通常指 fractions.Fraction 类型,用来**精确表示有理数(即两个整数相除的结果)**,避免浮点数运算带来的精度误差。
分数的核心用途:精确有理数计算
浮点数(如 0.1 + 0.2)在计算机中无法精确存储,结果常为 0.30000000000000004;而 Fraction 始终以分子/分母形式保存,全程不引入小数近似。
- 创建方式:
Fraction(1, 3)表示 1/3,Fraction('1/3')或Fraction(0.5)(自动转为最简分数1/2) - 自动约分:
Fraction(6, 8)会立即化为Fraction(3, 4) - 支持四则运算:
Fraction(1, 2) + Fraction(1, 3)得到Fraction(5, 6),结果仍精确
和浮点数、小数的区别
Fraction ≠ float:前者是精确的整数比,后者是二进制近似值;
Fraction ≠ Decimal:Decimal 专为十进制小数设计(适合货币),Fraction 则面向任意有理数(包括 1/7 这类无限循环小数)。
- 例如:
Fraction(1, 7)精确保存为1/7;转成float就丢失精度;Decimal('1') / Decimal('7')虽可设精度,但本质仍是截断近似 - 适用场景:数学推导、概率计算、需要严格相等判断(如
Fraction(1, 2) == Fraction(5, 10)返回True)
实际使用注意点
不是所有输入都能无损转为 Fraction。传入浮点数时,Python 实际转换的是该浮点数的**真实二进制值**,可能出人意料。
炫酷的jQuery二进制数字时钟,它的时分秒都是用二进制来表示,绿色表示该位值是1,灰色则表示0,原理是将时钟的时分秒分别实时转换成二进制,然后随着本地时间的更新而实时刷新
- 比如:
Fraction(0.1)不等于Fraction(1, 10),因为0.1在内存中本就是近似值(约等于3602879701896397/36028797018963968) - 安全做法:用字符串初始化 ——
Fraction('0.1')或Fraction('1/10'),才能得到预期结果 - 可随时提取分子分母:
f = Fraction(3, 4); f.numerator → 3; f.denominator → 4
它不是 Python 的基础类型,需显式导入:from fractions import Fraction。用对了,就能避开很多“0.1 + 0.2 ≠ 0.3”的困惑。
立即学习“Python免费学习笔记(深入)”;










