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

Python 分数(0.1)背后的重要原因=3602879701896397/36028797018963968,python,floating-point,fractions,Python,Floating Point,Fractions,我正在查看并尝试以下代码: from fractions import Fraction >>> print("Fraction (0.5):", Fraction(0.5)) Fraction (0.5): 1/2 >>> print("Fraction (0.1):", Fraction(0.1)) Fraction (0.1): 3602879701896397/36028797018963968 >>> print(1/10)

我正在查看并尝试以下代码:

from fractions import Fraction

>>> print("Fraction (0.5):", Fraction(0.5))
Fraction (0.5): 1/2
>>> print("Fraction (0.1):", Fraction(0.1)) 
Fraction (0.1): 3602879701896397/36028797018963968
>>> print(1/10) 
0.1
看着
分数(0.1)
的结果,我以为这是我的电脑问题,但当我在几台电脑上尝试时,结果是一样的

我的问题

  • 是否有任何计算理由选择这些奇数
    3602879701896397/36028797018963968
    而不是
    1/10
    ,就像选择
    1/2
    作为分数(0.5)一样
  • python中存在更多这样的代码

  • 是的,这是因为这是浮点
    0.1
    (不能用浮点精确表示)的整数比率:

    如果想要正确的
    分数
    s,则需要同时使用两个参数或传入字符串:

    >>> Fraction(1, 10)
    Fraction(1, 10)
    
    >>> Fraction('0.1')
    Fraction(1, 10)
    
    或者从浮动创建后(不保证在所有情况下都能工作):



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

    >>> Fraction(0.2)
    Fraction(3602879701896397, 18014398509481984)
    
    >>> Fraction(0.3)
    Fraction(5404319552844595, 18014398509481984)
    
    >>> Fraction(1/3)
    Fraction(6004799503160661, 18014398509481984)
    

    数字
    1/10
    不能用二进制精确表示,正如
    1/7
    不能用十进制精确表示一样。有关此问题的规范讨论,请参阅。@Barmar哦,我明白了,1/7不能精确整除,但1/10在数学上精确等于0.1这在十进制中是正确的。在二进制中情况是不同的。1/2和1/4是完全可除的,但1/10不是。1/7和1/10一样“完全可除”。在基数7中,1/7写为“0.1”。基数10没有什么特别之处;这只是一个普通的符号系统。谢谢你的回答,任何其他的存在,或者仅仅是因为
    0.1
    @nivas:这发生在任何不能用二进制表示法完美表示的数字上
    0.1
    只是众多数字中的一个,很多数字都是如此。这是浮点数的缺点。有无穷多个浮点数many@MSeifert
    分数('0.1')
    分数(0.1)
    哪个是对的&有什么区别?
    分数(0.1)
    总是(几乎)错误的,因为它首先创建了一个浮点(不精确)然后才将不精确的浮点转换成分数。
    分数('0.1')
    方法(几乎)总是更好,因为分数尽可能精确地解析字符串,这就是它返回
    分数(1,10)
    的原因。
    >>> Fraction(0.1).limit_denominator()
    Fraction(1, 10)
    
    >>> Fraction(0.2)
    Fraction(3602879701896397, 18014398509481984)
    
    >>> Fraction(0.3)
    Fraction(5404319552844595, 18014398509481984)
    
    >>> Fraction(1/3)
    Fraction(6004799503160661, 18014398509481984)