Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认情况下,哪些版本的Python使用rational算术?_Python_Python 3.x_Floating Point_Rational Number - Fatal编程技术网

默认情况下,哪些版本的Python使用rational算术?

默认情况下,哪些版本的Python使用rational算术?,python,python-3.x,floating-point,rational-number,Python,Python 3.x,Floating Point,Rational Number,如果我在Python 2.7.1 shell或3.3.2 shell中键入以下内容: a = 0.1 b = 0.1 (a + b) == 0.2 它返回值true。从stackoverflow和,我的印象是这将返回false,因为在计算机中尝试精确表示0.1时会出现小错误。(它到底不是二进制的吗?) 哪个版本的Python具有这种行为?它们都没有。这是“运气”。浮点表示+算术为您拾取的数字提供相同的值 >>> (0.1 + 0.1) == 0.2 True >>

如果我在Python 2.7.1 shell或3.3.2 shell中键入以下内容:

a = 0.1
b = 0.1
(a + b) == 0.2
它返回值
true
。从stackoverflow和,我的印象是这将返回
false
,因为在计算机中尝试精确表示0.1时会出现小错误。(它到底不是二进制的吗?)

哪个版本的Python具有这种行为?

它们都没有。这是“运气”。浮点表示+算术为您拾取的数字提供相同的值

>>> (0.1 + 0.1) == 0.2
True
>>> (0.1 + 0.2) == 0.3
False
您可以使用显示以下内容:

>>> import decimal
>>> decimal.getcontext().prec = 60
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> decimal.Decimal(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')
>>> decimal.Decimal(0.1) + decimal.Decimal(0.1)
Decimal('0.2000000000000000111022302462515654042363166809082031250')

更深入的解释是:0.1十进制不能精确地表示为有限二进制浮点,因此
0.1
的两个实例都引入了小错误(小于2**53中的1部分,因为几乎所有机器上的Python浮点都有53位精度,Python做了最好的四舍五入)。但浮动加法也会受到自身舍入误差的影响。有时错误会被抵消


所以“运气”是一个足够准确的描述。如果您想改用无界有理数,请参阅标准分数模块的文档。

尝试
0.1+0.2==0.3
。错误不一定总是发生。@BartoszKP:LOL,我选择了相同的数字:)@KarolyHorvath;我记得他们,因为最近有一个问题特别是:)我还不能接受答案,否则我会接受。还有一个问题:如何看到0.1或0.2的“实际”表示?我知道使用print语句就可以找到答案,但即使我只是在解释器中键入
0.1
,它也会简单地吐出
0.1
**编辑:我知道你已经准备好回答这个问题了。谢谢@AmadeusDrZaius,当前版本的Python显示最短的十进制字符串,当读回时,该字符串将精确地再现浮点。你输入的这么多十进制字符串会被逐字回复。@TimPeters明白了。谢谢你,蒂姆!“幸运”的一部分是
x+x
始终是二进制的精确操作(除非溢出)。