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)一样是的,这是因为这是浮点
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)