[Python标准库]decimal——定点数和浮点数的数学运算

作用:使用定点数和浮点数的小数运算。

Python 版本:2.4 及以后版本

decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算。Decimal 实例可以准确地表示任何数,对其上取整或下取整,还可以对有效数字个数加以限制。

Decimal

小数值表示为 Decimal 类的实例。构造函数取一个整数或字符串作为参数。使用浮点数创建 Decimal 之前,可以先将浮点数转换为一个字符串,使调用者能够显式地处理值得位数,倘若使用硬件浮点数表示则无法准确地表述。另外,利用类方法 from_float()可以转换为精确的小数表示。

import decimal

fmt = '{0:<25} {1:<25}'

print fmt.format('Input', 'Output')

print fmt.format('-' * 25, '-' * 25)

# Integer

print fmt.format(5, decimal.Decimal(5))

# String

print fmt.format('3.14', decimal.Decimal('3.14'))

# Float

f = 0.1

print fmt.format(repr(f), decimal.Decimal(str(f)))

print fmt.format('%.23g' % f, str(decimal.Decimal.from_float(f))[:25])

浮点数值 0.1 并不表示为一个精确的二进制值,所以 float 的表示与 Decimal 值不同。在这个输出中它被截断为 25 个字符。

Decimal 还可以由元组创建,其中包含一个符号标志(0 表示正,1 表示负)、数字 tuple 以及一个整数指数。

import decimal

# Tuple

t = (1, (1, 1), -2)

print 'Input :', t

print 'Decimal:', decimal.Decimal(t)

基于元组的表示创建时不太方便,不过它提供了一种可移植的方式,可以导出小数值而不会损失精度。tuple 形式可以在网络上传输,或者在不支持精确小数值得数据库中存储,以后再转回回 Decimal 实例。

算术运算

Decimal 重载了简单的算术运算符,所以可以采用内置数值类型同样的方式处理 Decimal 实例。

import decimal

a = decimal.Decimal('5.1')

b = decimal.Decimal('3.14')

c = 4

d = 3.14

print 'a =', repr(a)

print 'b =', repr(b)

print 'c =', repr(c)

print 'd =', repr(d)

print

print 'a + b =', a + b

print 'a - b =', a - b

print 'a * b =', a * b

print 'a / b =', a / b

print

print 'a + c =', a + c

print 'a - c =', a - c

print 'a * c =', a * c

print 'a / c =', a / c

print

print 'a + d =',

try:

print a + d

except TypeError, e:

print e

Decimal 运算符还接受整数参数,不过浮点数值必须转换为 Decimal 实例。

除了基本算术运算,Decimal 还包括一些方法来查找以 10 为底的对数和自然对数。log10() 和 ln() 返回的值都是 Decimal 实例,所以可以与其他值一样直接在公式中使用。

特殊值

除了期望的数字值,Decimal 还可以表示很多特殊值,包括正负无穷大值、“不是一个数”(NaN)和 0。

import decimal

for value in [ 'Infinity', 'NaN', '0' ]:

print decimal.Decimal(value), decimal.Decimal('-' + value)

print

# Math with infinity

print 'Infinity + 1:', (decimal.Decimal('Infinity') + 1)

print '-Infinity + 1:', (decimal.Decimal('-Infinity') + 1)

# Print comparing NaN

print decimal.Decimal('NaN') == decimal.Decimal('Infinity')

print decimal.Decimal('NaN') != decimal.Decimal(1)

与无穷大值相加会返回另一个无穷大值。与 NaN 比较相等性总会返回 false,而比较不等性总会返回 true。与 NaN 比较大小来确定排序顺序没有明确定义,这会导致一个错误。

上下文

到目前为止,前面的例子使用的都是 decimal 模块的默认行为。还可以使用一个上下文(context)覆盖某些设置,如保持精度、如何完成取整、错误处理等等。上下文可以应用于一个线程中的所有 Decimal 实例,或者局部应用于一个小代码区。

1. 当前上下文

要获取当前全局上下文,可以使用 getcontext()。

import decimal

import pprint

context = decimal.getcontext()

print 'Emax =', context.Emax

print 'Emin =', context.Emin

print 'capitals =', context.capitals

print 'prec =', context.prec

print 'rounding =', context.rounding

print 'flags ='

pprint.pprint(context.flags)

print 'traps ='

pprint.pprint(context.traps)

这个示例脚本显示了 Context 的公共属性。

2. 精度

上下文的 prec 属性控制着作为算术运算结果所创建的新值的精度。字面量值会按这个属性保持精度。

import decimal

d = decimal.Decimal('0.123456')

for i in range(4):

decimal.getcontext().prec = i

print i, ':', d, d * 1

要改变精度,可以直接为这个属性赋一个新值。

3. 取整

取整有多种选择,以保证值在所需精度范围内。

•ROUND_CEILING 总是趋向于无穷大向上取整。

•ROUND_DOWN 总是趋向 0 取整。

•ROUND_FLOOR 总是趋向负无穷大向下取整。

•ROUND_HALF_DOWN 如果最后一个有效数字大于或等于 5 则朝 0 反方向取整;否则,趋向 0 取整。

•ROUND_HALF_EVEN 类似于 ROUND_HALF_DOWN,不过,如果最后一个有效数字值为 5,则会检查前一位。偶数值会导致结果向下取整,奇数值导致结果向上取整。

•ROUND_HALF_UP 类似于 ROUND_HALF_DOWN,不过如果最后一位有效数字为 5,值会朝 0 的反方向取整。

•ROUND_UP 朝 0 的反方向取整。

•ROUND_05UP 如果最后一位是 0 或 5,则朝 0 的反方向取整;否则向 0 取整。

import decimal

context = decimal.getcontext()

ROUNDING_MODES = [

'ROUND_CEILING',

'ROUND_DOWN',

'ROUND_FLOOR',

'ROUND_HALF_DOWN',

'ROUND_HALF_EVEN',

'ROUND_HALF_UP',

'ROUND_UP',

'ROUND_05UP',

]

header_fmt = '{:10} ' + ' '.join(['{:^8}'] * 6)

print header_fmt.format(' ',

'1/8 (1)', '-1/8 (1)',

'1/8 (2)', '-1/8 (2)',

'1/8 (3)', '-1/8 (3)',

)

for rounding_mode in ROUNDING_MODES:

print '{0:10}'.format(rounding_mode.partition('_')[-1]),

for precision in [ 1, 2, 3 ]:

context.prec = precision

context.rounding = getattr(decimal, rounding_mode)

value = decimal.Decimal(1) / decimal.Decimal(8)

print '{0:^8}'.format(value),

value = decimal.Decimal(-1) / decimal.Decimal(8)

print '{0:^8}'.format(value),

print

这个程序显示了使用不同算法将同一个值取整为不同精度的效果。

4. 局部上下文

使用 Python 2.5 或以后版本时,可以使用 with 语句对一个代码块应用上下文。

import decimal

with decimal.localcontext() as c:

c.prec = 2

print 'Local precision:', c.prec

print '3.14 / 3 =', (decimal.Decimal('3.14') / 3)

print

print 'Default precision:', decimal.getcontext().prec

print '3.14 / 3 =', (decimal.Decimal('3.14') / 3)

Context 支持 with 使用的上下文管理器 API,所以这个设置只在块内应用。

5. 各实例上下文

上下文还可以用来构造 Decimal 实例,然后可以从这个上下文继承精度和转换的取整参数。

import decimal

# Set up a context with limited precision

c = decimal.getcontext().copy()

c.prec = 3

# Create our constant

pi = c.create_decimal('3.1415')

# The constant value is rounded off

print 'PI :', pi

# The result of using the constant uses the global context

print 'RESULT:', decimal.Decimal('2.01') * pi

这样一来,应用就可以区别于用户数据精度而另外选择常量值精度。

6. 线程

“全局”上下文实际上是线程本地上下文,所以完全可以使用不同的值分别配置各个线程。

import decimal

import threading

from Queue import PriorityQueue

class Multiplier(threading.Thread):

def __init__(self, a, b, prec, q):

self.a = a

self.b = b

self.prec = prec

self.q = q

threading.Thread.__init__(self)

def run(self):

c = decimal.getcontext().copy()

c.prec = self.prec

decimal.setcontext(c)

self.q.put( (self.prec, a * b) )

return

a = decimal.Decimal('3.14')

b = decimal.Decimal('1.234')

# A PriorityQueue will return values sorted by precision, no matter

# what order the threads finish.

q = PriorityQueue()

threads = [ Multiplier(a, b, i, q) for i in range(1, 6) ]

for t in threads:

t.start()

for t in threads:

t.join()

for i in range(5):

prec, value = q.get()

print prec, '\t', value

这个例子使用指定的值创建一个新的上下文,然后安装到各个线程中。

总结

以上所述是小编给大家介绍的python中的decimal类型转换实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python decimal类型转化_python中的decimal类型转换实例详解相关推荐

  1. python迭代器创建序列_Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...

  2. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  3. python获取键盘按键_Python中捕获键盘的方式详解

    python中捕获键盘操作一共有两种方法 第一种方法: 使用pygame中event方法 使用方式如下:使用键盘右键为例 if event.type = pygame.KEYDOWN and even ...

  4. python 自动化办公 案例_python自动化工具之pywinauto实例详解

    python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...

  5. python迭代器与生成器_python的迭代器与生成器实例详解

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  6. [转载] python 遍历字符串 字符_python 遍历字符串(含汉字)实例详解

    参考链接: Python字符串| rfind python 遍历字符串(含汉字)实例详解 python 遍历字符串(含汉字)实例详解 s = "中国china" for j in ...

  7. python 遍历字符串 字符_python 遍历字符串(含汉字)实例详解

    python 遍历字符串(含汉字)实例详解 python 遍历字符串(含汉字)实例详解 s = "中国china" for j in s: print j 首先一个,你这个'a'是 ...

  8. python实现文本编辑器_Python实现文本编辑器功能实例详解

    这篇文章主要介绍了Python实现的文本编辑器功能,结合实例形式详细分析了基于wxpython实现文本编辑器所需的功能及相关实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现的文本编辑器功 ...

  9. python类初始化导入库_Python中optparser库用法实例详解

    本文研究的主要是Python中optparser库的相关内容,具体如下. 一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常 ...

最新文章

  1. rabbitmq连接java快速入门
  2. 关于cast类型转换后无法使用索引的优化
  3. Python类的结构及属性的获取机制
  4. 17、字符设备控制技术
  5. 大话oraclerac集群、高可用性、备份与恢复_数腾Oracle RAC数据库灾备解决方案
  6. HTML5 canvas点击爆炸网页特效代码
  7. mysql drop user 并删除_MySQL删除用户( DROP USER)
  8. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  9. 【随笔】一个可爱的圆函数模型
  10. 为什么压缩图片和压缩
  11. 方维众筹网站源码V1.71 PC+WAP+商业版
  12. IO字节流读取文本中文乱码
  13. IoTDB PMC 黄向东成功入选『2021 中国开源先锋 33 人之心尖上的开源人物』,我们记录了他和 IoTDB 的故事...
  14. 高仿微信 Windows 端
  15. PDF文件去除页边距空白
  16. 【论文笔记】AAAI2022多智能体强化学习论文五篇
  17. UDS-统一诊断服务
  18. 由于应用程序配置不正确,未能启动该应用程序。请查看清单文件以查找可能的错误
  19. ps改变叶子中的图片
  20. park与unpark

热门文章

  1. ASP.NET Core 使用IIS作为Web服务器,部署在IIS上
  2. [快刀青衣]文章列表
  3. 弹出层(Div)屏蔽父窗口并且让父窗口变暗
  4. selenium第三课(selenium八种定位页面元素方法)
  5. Unity射线,摄像机和物体发射射线
  6. 【网络安全之Web系列三】CentOS6.5基础
  7. 工商银行银联标准芯片卡
  8. 用旧手机当机顶盒看电视,应该怎样连接?
  9. android studio : connection refused
  10. js 下拉菜单的显示与隐藏