分数 (0.1) 背后的重要原因 = 3602879701896397/36028797018963968
Significant Reason behind Fraction(0.1) = 3602879701896397/36028797018963968
我正在查看 Python documentation of 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)
0.1
看Fraction(0.1)
的结果我以为是我电脑的问题,结果在几台电脑上试了都是一样的。
我的问题
- 是否有任何计算原因选择这些奇数
3602879701896397/36028797018963968
而不是 1/10
就像为 Fraction(0.5)
选择 1/2
一样
- python?
中还有更多这些内容
是的,那是因为那是浮点数 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
s 你需要使用两个参数或传入一个字符串:
>>> Fraction(1, 10)
Fraction(1, 10)
>>> Fraction('0.1')
Fraction(1, 10)
或 limit the denominator 从浮动创建它之后(不保证在所有情况下都有效):
>>> Fraction(0.1).limit_denominator()
Fraction(1, 10)
关于你的第二个问题:在数学中有无穷多的有理数(可以精确表示为分数的小数)但是计算机使用64位来表示double
s(Python float
类型)。这意味着只有少数实数 可以 具有 double
的精确表示。所以还有很多其他号码有同样的问题,仅举几例:
>>> Fraction(0.2)
Fraction(3602879701896397, 18014398509481984)
>>> Fraction(0.3)
Fraction(5404319552844595, 18014398509481984)
>>> Fraction(1/3)
Fraction(6004799503160661, 18014398509481984)
我正在查看 Python documentation of 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)
0.1
看Fraction(0.1)
的结果我以为是我电脑的问题,结果在几台电脑上试了都是一样的。
我的问题
- 是否有任何计算原因选择这些奇数
3602879701896397/36028797018963968
而不是1/10
就像为Fraction(0.5)
选择1/2
一样 - python? 中还有更多这些内容
是的,那是因为那是浮点数 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
s 你需要使用两个参数或传入一个字符串:
>>> Fraction(1, 10)
Fraction(1, 10)
>>> Fraction('0.1')
Fraction(1, 10)
或 limit the denominator 从浮动创建它之后(不保证在所有情况下都有效):
>>> Fraction(0.1).limit_denominator()
Fraction(1, 10)
关于你的第二个问题:在数学中有无穷多的有理数(可以精确表示为分数的小数)但是计算机使用64位来表示double
s(Python float
类型)。这意味着只有少数实数 可以 具有 double
的精确表示。所以还有很多其他号码有同样的问题,仅举几例:
>>> Fraction(0.2)
Fraction(3602879701896397, 18014398509481984)
>>> Fraction(0.3)
Fraction(5404319552844595, 18014398509481984)
>>> Fraction(1/3)
Fraction(6004799503160661, 18014398509481984)