Python:为什么小数要近似?

时间:2015-03-04 23:13:50

标签: python-3.4

我正在尝试使用IDLE Python 3.4.0 shell,并执行以下代码。

>>> from decimal import *
>>> getcontext().prec = 500
>>> e = Decimal(2.4)
>>> print(e)
2.399999999999999911182158029987476766109466552734375

正如您所看到的,我将变量e设置为恰好等于2.4,仅此而已。但是,当我打印e而不是打印2.42.400000...时,它会打印出您在上面看到的内容。然后我尝试将getcontext().prec更改为5,它仍然打印完全相同的结果。现在,为了重复我的实验,我用一个整数来测试它,然后是另一个十进制数。

>>> f = Decimal(10)
>>> print(f)
10
>>> g = Decimal(10.1)
>>> print(g)
10.0999999999999996447286321199499070644378662109375

只要我用十进制类分配非整数,就会打印奇怪的十进制数字串。 最后,我用浮点数测试了这个。

>>> h = float(2.4)
>>> print(h)
2.4
>>> i = float(10.1)
>>> print(i)
10.1

为什么十进制类会导致这些奇数小数串而不是确切的数字?

2 个答案:

答案 0 :(得分:2)

当您将文字2.4传递给Decimal时,您将从浮点数2.4创建Decimal。 float的值已经近似,Decimal无法获得" exactness"回来。

要准确创建十进制(2.4),您可以传递一个字符串

>>> from decimal import *
>>> getcontext().prec = 500
>>> e = Decimal('2.4')
>>> e
Decimal('2.4')

或对从整数派生的十进制使用除法

>>> Decimal(24)/10
Decimal('2.4')

答案 1 :(得分:1)

这与Python无关,它只是计算机处理浮点运算的方式。

假装你试图在基数10中将1/3完全写为十进制 - 你不能没有无限的时间或纸张。 (0.333333 ...)有无穷多的3,所以任何十进制表示只能是近似值。

同样,计算机无法以完美的精度表示某些分数。 (因为他们没有无限的内存)所以在这种情况下,最接近计算机可以得到10.1是10.0999999999999996447286321199499070644378662109375。这与getcontext()或其他任何内容无关,因为计算机无法完全准确地存储10.1或2.4。