这是 数学重学路线图 阶段〇的子页面
分数与小数
分数是除法的另一种写法,小数是分数的十进制展开
上一节:00-数与运算
为什么要学这个
分数和小数是日常生活和编程中无处不在的概念
打折、税率、比例、概率——全是分数的应用
后端开发中的分页、比率计算、精度控制都离不开分数思维
安全场景:错误率、误报率、漏报率都是分数
大数据场景:采样率、压缩比、数据完整率
核心概念:分数的本质
分数就是除法
1/4 = 1 ÷ 4 = 0.25
3/5 = 3 ÷ 5 = 0.6
分数线就是除号,分子是被除数,分母是除数
这不是两个不同的东西,是同一个东西的两种写法
分数的组成
1 | 分子 (numerator) |
分子:表示”取了几份”
分母:表示”一共分成几份”
1/4 的直觉:把一个披萨切成 4 块,取其中 1 块
分母不能为 0
5/0 = ? → 意味着 ? × 0 = 5
但任何数 × 0 = 0,不可能等于 5
所以除以 0 没有意义,这不是”无穷大”,是”未定义”
在编程中:ZeroDivisionError / ArithmeticException
安全隐患:除零错误可以被攻击者利用来触发服务崩溃(DoS)
真分数、假分数、带分数
真分数
分子 < 分母,值在 0 和 1 之间
1/4, 3/5, 7/8 都是真分数
假分数
分子 ≥ 分母,值 ≥ 1
5/3, 8/4, 7/7 都是假分数
带分数
整数部分 + 真分数部分
5/3 = 1 又 2/3(1 个整的 + 2/3)
转换方法:5 ÷ 3 = 商1余2 → 1 又 2/3
编程中很少用带分数,一般直接用小数或假分数
约分:化简分数
什么是约分
把分子分母同时除以它们的公因数
6/8 → 分子分母都除以 2 → 3/4
约到不能再约为止 = 最简分数
最大公约数 GCD(Greatest Common Divisor)
约分的关键是找到分子分母的最大公约数
12/18:GCD(12, 18) = 6,所以 12/18 = 2/3
辗转相除法(欧几里得算法)
求 GCD 的经典算法,思想简单但极其优雅
GCD(a, b) = GCD(b, a % b),直到余数为 0
例:GCD(48, 18)
48 % 18 = 12 → GCD(18, 12)
18 % 12 = 6 → GCD(12, 6)
12 % 6 = 0 → GCD = 6
人话翻译:反复用大的除以小的取余数,直到整除
这个算法在密码学中也会用到(求模逆元)
辗转相除法的 Python 实现
1 | def gcd(a, b): |
通分:找公分母
什么是通分
把不同分母的分数变成相同分母,方便比较和加减
1/3 和 1/4 → 变成 4/12 和 3/12
最小公倍数 LCM(Least Common Multiple)
通分的关键是找分母的最小公倍数
LCM(a, b) = a × b ÷ GCD(a, b)
例:LCM(3, 4) = 3 × 4 ÷ 1 = 12
例:LCM(6, 8) = 6 × 8 ÷ 2 = 24
LCM 的 Python 实现
1 | def lcm(a, b): |
分数的四则运算
加法和减法:先通分
1/3 + 1/4
通分:4/12 + 3/12 = 7/12
口诀:通分之后加分子,分母不变
1 | 1 1 4 3 7 |
乘法:分子乘分子,分母乘分母
2/3 × 4/5 = (2×4)/(3×5) = 8/15
直觉:蛋糕的 2/3 再取 4/5,就是 8/15
技巧:先约分再乘,数字更小不容易算错
2/3 × 3/4 = (2×3)/(3×4) → 先约分 → 2/4 = 1/2
除法:乘以倒数
2/3 ÷ 4/5 = 2/3 × 5/4 = 10/12 = 5/6
为什么除以一个分数等于乘以它的倒数?
2/3 ÷ 4/5 就是问:2/3 里面有多少个 4/5
除以 4/5 = 除以 4 再乘以 5 = 乘以 5/4
常见错误:忘了取倒数就直接乘了
运算规则汇总
1 | 加减法:先通分,分母相同后 加/减 分子 |
分数、小数、百分比互转
分数 → 小数
直接做除法:1/4 = 1 ÷ 4 = 0.25
1/3 = 0.333…(无限循环小数,记作 0.3̄)
小数 → 分数
0.75 = 75/100 = 3/4
0.333… = 1/3
技巧:数小数位数,分母就是对应的 10 的幂次
百分比 → 小数/分数
25% = 25/100 = 1/4 = 0.25
直接除以 100 即可
常用互转速查表
1 | 分数 小数 百分比 |
生活应用
做饭调整用量
食谱说 4 人份用 200g 面粉
只做 2 人份:200 × 2/4 = 200 × 1/2 = 100g
做 6 人份:200 × 6/4 = 200 × 3/2 = 300g
本质就是比例缩放
打折计算
8 折 = 原价 × 0.8 = 原价 × 4/5
打 65 折 = 原价 × 0.65 = 原价 × 13/20
满 300 减 50 相当于打几折? (300-50)/300 = 250/300 ≈ 0.833 → 约 8.3 折
注意:满减不等于全场打折,只有刚好花 300 时折扣最大
税率
增值税 13%:含税价 = 不含税价 × 1.13
不含税价 = 含税价 / 1.13(不是 × 0.87!)
这是一个常见的数学错误:加 13% 的逆运算不是减 13%
加 13%:× 1.13 → 逆运算:÷ 1.13
开发应用
分页计算
总 100 条数据,每页 15 条,需要几页?
100 ÷ 15 = 6.666… → 需要 7 页(向上取整)
公式:total_pages = ceil(total_items / page_size)
或者整数方法:total_pages = (total_items + page_size - 1) // page_size
比率计算
错误率 = 错误数 / 总请求数
100 万请求中有 50 个错误 → 50/1000000 = 0.005% = 5 × 10^(-5)
可用性 = 1 - 错误率 = 99.995%
比例分配
按权重分配流量:A 服务权重 3,B 服务权重 2
A 的流量占比 = 3/(3+2) = 3/5 = 60%
B 的流量占比 = 2/(3+2) = 2/5 = 40%
Python 代码实战
fractions 模块:精确分数运算
1 | from fractions import Fraction |
GCD 和 LCM 完整实现
1 | import math |
分页计算器
1 | import math |
比率和百分比工具
1 | def error_rate(errors, total): |
常见误区
误区1:分数除法忘记取倒数
错:2/3 ÷ 4/5 = 2/3 × 4/5 = 8/15
对:2/3 ÷ 4/5 = 2/3 × 5/4 = 10/12 = 5/6
误区2:加减法直接加分子和分母
错:1/3 + 1/4 = 2/7
对:1/3 + 1/4 = 4/12 + 3/12 = 7/12
误区3:以为加 13% 的逆运算是减 13%
不含税 100 → 含税 113 → 113 × 0.87 = 98.31 ≠ 100
正确逆运算:113 / 1.13 = 100
误区4:Fraction(0.1) 和 Fraction(‘0.1’) 一样
Fraction(0.1) 接收的是浮点数 0.1(已经不精确了)
Fraction(‘0.1’) 接收的是字符串,精确表示 1/10
误区5:分页计算用 int() 而不是 ceil()
int(100/15) = 6,丢了最后那 10 条数据
math.ceil(100/15) = 7,才是正确的页数
练习题
题目1:约分
将 84/126 化为最简分数
提示:先求 GCD(84, 126)
答案:GCD = 42,84/126 = 2/3
题目2:分数运算
计算 2/5 + 3/8 - 1/4
答案:LCM(5,8,4) = 40 → 16/40 + 15/40 - 10/40 = 21/40
题目3:实际应用
某商品原价 299 元,先涨价 10% 再打 9 折,最终价格是多少?
和直接 99 折(×0.99)比哪个便宜?
答案:299 × 1.1 × 0.9 = 299 × 0.99 = 296.01,两者相同!因为 1.1 × 0.9 = 0.99
题目4:编程题
用 Python 的 Fraction 类实现一个函数,输入一个有限小数字符串,输出最简分数
例:输入 “0.375” 输出 “3/8”
题目5:分页
数据库有 10237 条记录,每页显示 50 条
计算:总页数、第 100 页显示的是第几条到第几条
答案:ceil(10237/50) = 205 页;第 100 页显示第 4951~5000 条
小结
分数 = 除法的另一种写法
约分靠 GCD(辗转相除法),通分靠 LCM
加减先通分,乘法交叉乘,除法取倒数
分数/小数/百分比是三种写法,本质同一个数
编程中用 fractions.Fraction 做精确分数运算,用 math.ceil 做分页
下一节:02-幂根号与指数
| 上一章 | 目录 | 下一章 |
|---|---|---|
| 00-数与运算 | 数学重学路线图 | 02-幂根号与指数 |