鱼C论坛

 找回密码
 立即注册
查看: 2423|回复: 7

[已解决]关于Fraction函数的问题

[复制链接]
发表于 2023-2-13 21:51:14 | 显示全部楼层 |阅读模式

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

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

x
同样是用Fraction函数,为什么下面第一段代码两种写法运行后的值是相同的,而第二段代码运行后的值就不同呢,两端代码只是数字不同而已啊。

第一段代码
>>> from fractions import Fraction
>>> print(Fraction(10, 8))
5/4
>>> print(Fraction(10/8))
5/4


第二段代码
>>> print(Fraction(1708227363155544, 4636617128565048))
7/19
>>> print(Fraction(1708227363155544/4636617128565048))
6636883661388099/18014398509481984
>>>
最佳答案
2023-2-13 22:01:05
本帖最后由 isdkz 于 2023-2-13 22:04 编辑

因为传2个参数的时候它会直接帮你化简,而你传运算的结果就会帮你把小数转回分数

因为 10 除以 8 是可以除得尽的,所以没有精度丢失,

而 1708227363155544 除以 4636617128565048 是除不尽的,肯定会有精度丢失,

直接化简跟精度丢失后再转回分数的结果肯定不一样了

比如 30 除以 9 也是除不尽的,所以它会得到这样的结果:
>>> from fractions import Fraction
>>> print(Fraction(30, 9))
10/3
>>> print(Fraction(30/9))
7505999378950827/2251799813685248
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-13 22:01:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-2-13 22:04 编辑

因为传2个参数的时候它会直接帮你化简,而你传运算的结果就会帮你把小数转回分数

因为 10 除以 8 是可以除得尽的,所以没有精度丢失,

而 1708227363155544 除以 4636617128565048 是除不尽的,肯定会有精度丢失,

直接化简跟精度丢失后再转回分数的结果肯定不一样了

比如 30 除以 9 也是除不尽的,所以它会得到这样的结果:
>>> from fractions import Fraction
>>> print(Fraction(30, 9))
10/3
>>> print(Fraction(30/9))
7505999378950827/2251799813685248
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-13 22:08:49 | 显示全部楼层
>>> decimal.Decimal(1708227363155544/4636617128565048)
Decimal('0.368421052631578926916944283220800571143627166748046875')
>>> decimal.Decimal(1708227363155544)/decimal.Decimal(4636617128565048)
Decimal('0.368421052631578947368421052631578947368421052631578947')

https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 22:26:34 | 显示全部楼层
isdkz 发表于 2023-2-13 22:01
因为传2个参数的时候它会直接帮你化简,而你传运算的结果就会帮你把小数转回分数

因为 10 除以 8 是可以 ...

非常感谢您的解答,我这样理解能看对吗?
Fraction(a/b)
这种方式是先把a/b算出来,然后再转化为分数;
Fraction(a, b)
这种方式是把a当作分子,b当作分母,直接进行化简。

谢谢您,请指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 22:28:59 | 显示全部楼层
wbzxz 发表于 2023-2-13 22:26
非常感谢您的解答,我这样理解能看对吗?
Fraction(a/b)
这种方式是先把a/b算出来,然后再转化为分数 ...

对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 22:35:21 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 22:08
https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues

非常感谢您的指点,你看我这样理解对吗:
一种情况是
a/b的10进制结果,
另一种情况是
a的10进制结果/b的10进制结果
这两种情况算出来的值是不一样的,都是因为浮点数的影响吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 22:40:04 | 显示全部楼层
wbzxz 发表于 2023-2-13 22:35
非常感谢您的指点,你看我这样理解对吗:
一种情况是
a/b的10进制结果,

是这样的。直接进行的浮点数计算精度比先把双方都变成 Decimal 再计算的低,因此直观上交换顺序不应受到影响的结果实际上交换之后出现了不同

点评

非常感谢您从原理上的讲解,向您学习,受教了!!!  发表于 2023-2-13 22:47
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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