浮点数小数部分转分数功能异常,请求技术协助
问题分析与修复方案
你遇到的问题根源在于浮点数的精度误差,以及不必要地将整数运算转换为浮点数处理,导致Fraction无法得到精确的分数结果。
现有代码的问题点
- 你把分子和分母都转成浮点数计算余数:
rem=float(num)%float(den),但浮点数无法精确表示所有十进制小数(比如0.6在二进制浮点数里是近似值),这会让后续的Fraction转换得到一个非常接近但并不精确的分数。 - 额外使用
round(rem/den,2)也没必要,反而可能引入更多精度问题。
修复后的代码
我们可以直接用整数运算来处理余数,彻底避开浮点数的精度陷阱:
from fractions import Fraction def printValue(num, den): q = num // den # 整数除法直接得到商的整数部分,无精度损失 rem = num % den # 整数取余,结果完全精确 if rem > 0: r = Fraction(rem, den) # 用整数余数和分母直接构造精确分数 return (q, r) else: return (q,) num = int(input()) den = int(input()) z = printValue(num, den) for i in z: print(i, end=" ")
修复逻辑说明
- 整数的取余和除法运算都是精确的,比如
13%5直接得到整数3,没有任何精度损失。 - 用
Fraction(rem, den)直接从两个整数构造分数,能保证结果是最简形式的精确分数(比如3/5就是精确的,不会出现奇怪的大数字分子分母)。
测试13÷5时,这段代码会输出2 3/5,完全符合预期;9÷4也会正确输出2 1/4。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

