wbzxz 发表于 2023-2-13 21:51:14

关于Fraction函数的问题

同样是用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
>>>

isdkz 发表于 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
>>>

dolly_yos2 发表于 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

wbzxz 发表于 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当作分母,直接进行化简。

谢谢您,请指点。

isdkz 发表于 2023-2-13 22:28:59

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

对的

wbzxz 发表于 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进制结果
这两种情况算出来的值是不一样的,都是因为浮点数的影响吧。

dolly_yos2 发表于 2023-2-13 22:40:04

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


是这样的。直接进行的浮点数计算精度比先把双方都变成 Decimal 再计算的低,因此直观上交换顺序不应受到影响的结果实际上交换之后出现了不同
页: [1]
查看完整版本: 关于Fraction函数的问题