Python中的十进制定点和浮点运算
浮点数在内存中以2为基数的二进制分数表示。因此,浮点运算有时会很奇怪。0.1和0.2的加法可能会产生令人烦恼的结果,如下所示:
>>> 0.1 + 0.2 0.30000000000000004
事实上,这是二进制浮点表示的本质。这在任何编程语言中都很普遍。Python 提供了一个 decimal 模块来执行快速且正确舍入的浮点运算。
decimal 模块旨在精确地表示浮点数,就像人们希望它们的行为一样,并且算术运算的结果与预期一致。表示和运算的精度级别可以设置为最多 28 位。
decimal 模块定义了 Decimal 类。Decimal 对象可以通过给其构造函数提供整数、带有数字表示的字符串或元组作为参数来声明。
>>> from decimal import Decimal
>>> d1 = Decimal(10)
>>> d1
Decimal('10')
>>> d2 = Decimal('10')
>>> d2
Decimal('10')元组参数包含三个元素:符号(正数为 0,负数为 1)、数字元组和指数。例如:
>>> d3 = Decimal((1, (1, 2,3, 4), 2))
>>> d3
Decimal('-1.234E+5')表示特定精度浮点数的一种更便捷的方法是通过 getcontext() 函数获取当前线程的上下文环境,并为 Decimal 对象设置精度。
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 5
>>> d3 = Decimal(10)
>>> d4 = Decimal(3)
>>> d3/d4
Decimal('3.3333')上下文是用于算术运算的环境,用于确定精度和定义舍入规则,以及限制指数范围。
decimal.getcontext() − 返回活动线程的当前上下文。
decimal.setcontext(c) − 将活动线程的当前上下文设置为 c。
decimal 模块中定义了以下舍入模式常量:
| ROUND_CEILING | 向无穷大舍入。 |
| ROUND_DOWN | 向零舍入。 |
| ROUND_FLOOR | 向 -无穷大舍入。 |
| ROUND_HALF_DOWN | 最接近的舍入,如果相等则向零舍入。 |
| ROUND_HALF_EVEN | 最接近的舍入,如果相等则向最近的偶数整数舍入。 |
| ROUND_HALF_UP | 最接近的舍入,如果相等则远离零舍入。 |
| ROUND_UP | 远离零舍入。 |
| ROUND_05UP | 如果向零舍入后的最后一位数字为 0 或 5,则远离零舍入;否则向零舍入。 |
以下代码片段使用上下文对象的精度和舍入参数。
>>> from decimal import *
>>> getcontext().prec = 5
>>> getcontext().rounding = ROUND_UP
>>> d1 = Decimal(100)
>>> d2 = Decimal(6)
>>> d1/d2
Decimal('16.667')Decimal 对象的算术运算
所有常用的算术运算都可以在 Decimal 对象上进行,就像普通的浮点数一样。
>>> a = Decimal('2.4')
>>> b = Decimal('1.2')
>>> a + b
Decimal('3.6')
>>> a - b
Decimal('1.2')
>>> b - a
Decimal('-1.2')
>>> a * b
Decimal('2.88')
>>> a / b
Decimal('2')算术运算可以在一个 Decimal 操作数和一个整数操作数上进行。但是,对于普通的浮点对象,操作是无效的。
>>> a = Decimal('2.4')
>>> c = 2.1
>>> a + c
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
a+c
TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'所有算术运算都会发生相同的异常。
余数 (%) 运算符与 Decimal 对象的行为与普通数字类型略有不同。在这里,结果的符号是被除数的符号,而不是除数的符号。
>>> -7%3
2
>>> 7%-3
-2
>>> Decimal(-7) % Decimal(3)
Decimal('-1')
>>> Decimal(7) % Decimal(-3)
Decimal('1')Decimal.from_float() − 此函数将普通浮点数转换为具有精确二进制表示的 Decimal 对象。因此,from_float(0.1) 和 Decimal('0.1') 不相同。
>>> d1 = Decimal('0.1')
>>> d2 = Decimal.from_float(0.1)
>>> d1,d2
(Decimal('0.1'), Decimal('0.1000000000000000055511151231257827021181583404541015625'))本文解释了 Python 标准库的 decimal 模块中定义的功能的使用。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP