分数背后的重要原因(0.1)= 3602879701896397/36028797018963968

时间:2017-08-28 13:54:47

标签: python floating-point fractions

我正在查看enter image description here并尝试此代码:

Fraction(0.1)

查看3602879701896397/36028797018963968结果我认为这是我的计算机问题,但当我在几台计算机上尝试时,结果是相同的。

我的问题

  1. 是否有任何计算理由选择这些奇数1/10而不是1/2,就像Fraction(0.5)选择{{1}}一样。
  2. 更多这些存在于python中?

1 个答案:

答案 0 :(得分:2)

是的,那是因为它是浮动0.1的整数比率(不能用浮点数表示完全):

>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)

>>> '{:.30f}'.format(0.1)   # just to show that it can't be represented exactly I print 30 digits of 0.1
'0.100000000000000005551115123126'

如果你想要正确的Fraction,你需要使用两个参数或传入一个字符串:

>>> Fraction(1, 10)
Fraction(1, 10)

>>> Fraction('0.1')
Fraction(1, 10)
从浮动创建它之后

limit the denominator(不保证在所有情况下都有效):

>>> Fraction(0.1).limit_denominator()
Fraction(1, 10)

关于你的第二个问题:在数学中有无数多的有理数(可以完全表示为Fraction的十进制数)但计算机使用64位用于double s(Python float类型)。这意味着只有少数实数可以具有double的精确表示。所以有很多其他数字都有同样的问题,仅举几例:

>>> Fraction(0.2)
Fraction(3602879701896397, 18014398509481984)

>>> Fraction(0.3)
Fraction(5404319552844595, 18014398509481984)

>>> Fraction(1/3)
Fraction(6004799503160661, 18014398509481984)