鱼C论坛

 找回密码
 立即注册
查看: 26|回复: 4

[已解决]fraction函数计算分数约分后的值

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #并计算 1708227363155544/4636617128565048 约分后的值

  2. a = 1708227363155544/4636617128565048
  3. b = float(a)
  4. import fractions
  5. c = fractions.Fraction(b)
  6. print(c)[backcolor=Red][/backcolor]

复制代码


这串代码是什么意思啊
为什么运行结果与答案不相符啊
最佳答案
2 小时前
这串代码是什么意思啊
为什么运行结果与答案不相符啊


这串代码的目的是计算分数 1708227363155544/4636617128565048 约分后的值,但方法存在错误。下面逐步解释:

代码解释:

  1. a = 1708227363155544/4636617128565048
复制代码

在 Python 3 中,/ 运算符执行浮点数除法,所以 a 是一个浮点数(约等于 0.3685),而不是精确的分数。

  1. b = float(a)
复制代码

a 转换为浮点数,但这步多余,因为 a 已经是浮点数。

  1. import fractions
复制代码

导入 Python 的 fractions 模块,用于处理分数。

  1. c = fractions.Fraction(b)
复制代码

使用浮点数 b 创建 Fraction 对象。但浮点数有精度限制,所以这里是从近似值转换,而不是从原始整数分子分母转换。

  1. print(c)
复制代码

打印这个分数,但由于基于浮点数近似,结果可能不准确。

为什么运行结果与答案不相符?
因为浮点数除法丢失了精度,Fraction(b) 只能根据浮点数近似值来还原分数,而不是原始分数。例如,运行上述代码可能输出类似 51791395714755/140737488355328 的分数,这与正确结果不同。

正确的方法:
直接使用 Fraction 类处理整数分子和分母,避免精度损失:

  1. from fractions import Fraction

  2. # 直接使用分子和分母创建分数,会自动约分
  3. c = Fraction(1708227363155544, 4636617128565048)
  4. print(c)  # 输出约分后的分数
复制代码


运行正确代码后,输出结果为:
  1. Fraction(71176140131481, 193192380356877)
复制代码


这表示约分后的分数是 71176140131481/193192380356877。你可以进一步验证,分子和分母的最大公约数(GCD)为 24,因此:
1708227363155544 ÷ 24 = 71176140131481
4636617128565048 ÷ 24 = 193192380356877

总之,使用浮点数会导致精度问题,直接使用整数创建分数才能得到精确结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
第七行print(c)  之后的东西选择性忽略一下,我捣鼓着玩的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层    本楼为最佳答案   
这串代码是什么意思啊
为什么运行结果与答案不相符啊


这串代码的目的是计算分数 1708227363155544/4636617128565048 约分后的值,但方法存在错误。下面逐步解释:

代码解释:

  1. a = 1708227363155544/4636617128565048
复制代码

在 Python 3 中,/ 运算符执行浮点数除法,所以 a 是一个浮点数(约等于 0.3685),而不是精确的分数。

  1. b = float(a)
复制代码

a 转换为浮点数,但这步多余,因为 a 已经是浮点数。

  1. import fractions
复制代码

导入 Python 的 fractions 模块,用于处理分数。

  1. c = fractions.Fraction(b)
复制代码

使用浮点数 b 创建 Fraction 对象。但浮点数有精度限制,所以这里是从近似值转换,而不是从原始整数分子分母转换。

  1. print(c)
复制代码

打印这个分数,但由于基于浮点数近似,结果可能不准确。

为什么运行结果与答案不相符?
因为浮点数除法丢失了精度,Fraction(b) 只能根据浮点数近似值来还原分数,而不是原始分数。例如,运行上述代码可能输出类似 51791395714755/140737488355328 的分数,这与正确结果不同。

正确的方法:
直接使用 Fraction 类处理整数分子和分母,避免精度损失:

  1. from fractions import Fraction

  2. # 直接使用分子和分母创建分数,会自动约分
  3. c = Fraction(1708227363155544, 4636617128565048)
  4. print(c)  # 输出约分后的分数
复制代码


运行正确代码后,输出结果为:
  1. Fraction(71176140131481, 193192380356877)
复制代码


这表示约分后的分数是 71176140131481/193192380356877。你可以进一步验证,分子和分母的最大公约数(GCD)为 24,因此:
1708227363155544 ÷ 24 = 71176140131481
4636617128565048 ÷ 24 = 193192380356877

总之,使用浮点数会导致精度问题,直接使用整数创建分数才能得到精确结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
FishC 发表于 2026-1-17 15:44
这串代码的目的是计算分数 1708227363155544/4636617128565048 约分后的值,但方法存在错误。下面逐步 ...

谢谢
想问一下,如果第一行代码不选择
from fractions import Fraction
而是import fractions,
只需要把后续的Fraction改为fractions.Fraction就可以了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
HT_prandme 发表于 2026-01-17 15:49
FishC 发表于 2026-1-17 15:44
这串代码的目的是计算 ...


是的,两种导入方式都可以,只需要调整调用方式。具体区别如下:

方法一:使用 from fractions import Fraction

  1. from fractions import Fraction
  2. c = Fraction(1708227363155544, 4636617128565048)
  3. print(c)
复制代码


方法二:使用 import fractions

  1. import fractions
  2. c = fractions.Fraction(1708227363155544, 4636617128565048)
  3. print(c)
复制代码


两种方法的结果完全相同,都会输出正确的约分结果 71176140131481/193192380356877

建议:
- 如果代码中多次使用 Fraction,推荐方法一(写起来更简洁)
- 如果代码中还要使用 fractions 模块的其他功能,推荐方法二(避免命名冲突)

注意:无论哪种方式,都要确保传入的是整数参数,而不是浮点数,这样才能避免精度问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-17 18:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表