Python:执行精确的浮点数运算

时间:2023-12-27 23:13:07

需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现.

浮点数的一个普遍问题是它们并不能精确的表示十进制数。并且,即使是最简单的
数学运算也会产生小的误差,比如:

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False

”False“是由于底层CPU和IEEE标准通过自己的浮点单位去执行算术导致的。Python的浮点数据类型使用底层表示存储数据,所以无法无法避免这样的误差。

如果想更加精确(代价是性能损耗),可以使用decimal模块

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

上面真是乖乖的,用字符串表示数据。。。

然而Decimal对象支持所有的常用数学运算。

真实世界中很少会要求精确到普通浮点数能提供的17 位精度,执行大量运算的时候速度很重要。所以使用不要随便用decimal.

总的来说, decimal 模块主要用在涉及到金融的领域。在这类程序中,哪怕是一点
小小的误差在计算过程中蔓延都是不允许的。因此, decimal 模块为解决这类问题提
供了方法。当Python 和数据库打交道的时候也通常会遇到Decimal 对象,并且,通
常也是在处理金融数据的时候。