decimal 模块,提供了对小数精确的计算,内置的 float 类型是以二进制的浮点数保存的,是不准确的,小数点后会有很多奇怪的数字,虽然在一般情况下计算是没问题的,因为近似相等,小数点后十几位才会出现问题。但是 decimal 模块解决了这个问题,它可以提供精确的教科书般的结果。此外,模块还提供了几个特殊数:NaN,sNaN,-Infinity,Infinity,这些结果会在异常发生但不抛出时产生。

模块类:

1、Decimal 对象

decimal.Decimal([value[, context]]):用 value 以 context 规则创建一个新的 Decimal 对象,创建后此对象不会改变,context 中的精度不会影响值的存储,只有其中的异常设置会影响对象的创建。value 可以是整数,字符串,元组,浮点数或是另一个 Decimal 对象。若是元组,需要是一个三元元组,第一个是符号(0为正,1为负),第二个是数字元组,第三个是整数,代表了指数(10的几次方)

adjusted():将指数调整至整数部分只有一位,即正常写法,返回调整后的指数值
as_tuple():返回和创建对象时要求相同的有名字的元组(named tuple),DecimalTuple(sign, digits, exponent)
compare(other[, context]):比较两个 Decimal 对象的数值大小,同 compare() 函数,只是他返回的是 Decimal 对象。比较对象其中一个为 NaN,结果也为 NaN
compare_total(other):比较两个 Decimal 对象的绝对大小,和值的表现形式有关,与数值无关,即“1”和“1.0”是不一样的
compare_total_mag(other):同上,只是忽略了两者的符号,即加了绝对值
copy_abs(),copy_negate(),copy_sign(other):分别返回绝对值,相反数,拷贝符号,都不受 context 影响精度,不改变 flag 状态,也不会凑整
exp([context]):返回 e 的 x 次方,结果 ROUND_HALF_EVEN 凑整
fma(other, third[, context]):返回 self*other+third,中间结果不会凑整,所以不会出现错误
ln([context]),log10([context]):分别返回 e 为底和 10 为底的对数结果,结果 ROUND_HALF_EVEN 凑整
logb([context]):对非 0 对象,返回一个 Decimal 对象,值为调整后的指数。若为 0,则返回 Decimal('-Infinity'),同时 DivisionByZero 标志被激活
next_minus([context]),next_plus([context]),next_toward(other[, context]):分别返回在特定 context 下,最大的不超过对象的值,最小的超过对象的值,最接近的朝着第二个对象方向的值
normalize([context]):移除末尾的 0,将数字都标准化至统一格式
number_class([context]):返回描述运算对象类型的字符串
quantize(exp[, rounding[, context[, watchexp]]]):返回经过取整的,和第二个运算对象有相同指数的值。简单说就是指定保留几位小数
radix():返回 Decimal(10),一般用于做基数,底数,10 的几次方
rotate(other[, context]),shift(other[, context]):移动小数点位置,正的往右移,即数值变大,负的往左移,数值变小,rotate 只移动小数点,shift 往左移会变成 0
same_quantum(other[, context]):比较两者指数是否相同
scaleb(other[, context]):返回对象乘以 10的 other 次方
sqrt([context]):返回满 context 精度的结果

2、Context 对象

内置有 BasicContext,ExtendedContext(所有异常都不设置),DefaultContext,这些内置对象的属性都是可以改变的

decimal.Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1):创建自定义 context 对象,prec 指定精度(数字总长度),包括整数部分和小数部分,rounding 指定取整方式,traps 和 flags 设置异常的捕捉,Emin 和 Emax 设置最大最小值,capitals 设置指数大小写

  • ROUND_CEILING (towards Infinity),
  • ROUND_DOWN (towards zero),
  • ROUND_FLOOR (towards -Infinity),
  • ROUND_HALF_DOWN (to nearest with ties going towards zero),
  • ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),
  • ROUND_HALF_UP (to nearest with ties going away from zero), or
  • ROUND_UP (away from zero).
  • ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)

clear_flags():清楚所有 flag
copy():返回 context 的复制
create_decimal(num):根据 context 的要求创建 Decimal 对象,包括精度
Decimal 对象拥有的方法它基本上也有,只是参数变成了要运算的 Decimal 对象,同时结果受到 context 各属性的影响

3、异常对象

decimal.Clamped:指数超出了指定范围
decimal.DecimalException:异常基类
decimal.DivisionByZero:除数为 0
decimal.Inexact:发生了取整,结果不精确
decimal.InvalidOperation:无效操作,如果没有被捕获,返回NaN
decimal.Overflow:取整后结果超出上限
decimal.Rounded:发生了取整,但结果可能还是精确的
decimal.Subnormal:取整后结果超出下限
decimal.Underflow:取整后结果变为 0

模块方法:

decimal.getcontext():获得当前线程的 context 属性
decimal.setcontext(c):将当前线程的 context 属性设置为 c
decimal.localcontext([c]):with 语句中使用,将语句块中的 context 属性设置为 c

Python2.7-decimal的更多相关文章

  1. Python核心编程--学习笔记--5--数字

    本章的主题是Python中的数字,这里详细介绍每一种数字类型,它们适用的各种运算符,以及用于处理数字的内建函数.在本章的末尾简单介绍了几个标准库中用于处理数字的模块. 1 数字类型 数字:标量贮存,可 ...

  2. Python基础:02数字

    1:Python标准整数类型等价于C的(有符号)长整型.整数一般以十进制表示,但是Python也支持八进制或十六进制来表示整数.八进制整数以数字“0”开始, 十六进制整数则以“0x”或“0X”开始. ...

  3. CentOS升级Python2.7导致使用pip等命令安装模块失败

    报错如下: # pip Traceback (most recent call last): File , in <module> from pkg_resources import lo ...

  4. 自学Python2.1-基本数据类型-字符串str(object)

    Python str方法总结 class str(object): """ str(object='') -> str str(bytes_or_buffer[, ...

  5. 自学Python2.1-基本数据类型-字符串方法 下

    自学Python之路 自学Python2.1-基本数据类型-字符串方法 下 class str(object): """ str(object='') -> str ...

  6. python3.X中简单错误处理,和Python2区别

    1.print 1.1 Print是一个函数 在Python3中print是个函数,这意味着在使用的时候必须带上小括号,并且它是带有参数的. >>> print 'hello wor ...

  7. 资深程序员告诉你为什么要用Python3而不是Python2

    经常遇到这样的问题:<现在开始学习python的话,是学习python2.x还是学习python3.x比较好?>,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助 ...

  8. 没有神话,聊聊decimal的“障眼法”

    0x00 前言 在上一篇文章<妥协与取舍,解构C#中的小数运算>的留言区域有很多朋友都不约而同的说道了C#中的decimal类型.事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是 ...

  9. 让VIM支持Python2 by update-alternatives

    前言  Ubuntu 16+中$ sudo apt install vim所安装的vim只支持Python3,但很多插件如YCM和powerline均需要Python2,那就来场"生命贵在折 ...

  10. 烂泥:python2.7和python3.5源码安装

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天在centos6.6安装ansible时,一直提示python版本不对,导致不能安 ...

随机推荐

  1. 【15】模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...

  2. HUST1017(KB3-A Dancing links)

    1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 7270 Solved: 3754 ...

  3. JSON: jasckson 字段 过滤

    有这样一个场景存在一个model类如果User,这里省略了getter/setter方法 class User { String name; String uuid; Long created; Lo ...

  4. 排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序

    1.基本思想 基数排序是通过“分配”和“收集”过程来实现排序 2.实现原理 基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位.主要分为两个过程: (1)分配,先从个位开 ...

  5. mvp在flutter中的应用

    mvp模式的优点mvp模式将视图.业务逻辑.数据模型隔离,使用mvp模式,能使复杂的业务逻辑变得更加清晰,使代码更具有灵活性和扩展性,正是这些优点,使mvp模式广泛应用于原生开发中. flutter使 ...

  6. 测试sql server服务是否配置正确

    最简单的方法: 新建一个testdb.udl文件,双击可出现测试界面

  7. 【python】python常用函数

    urlencode与urldecode 当url中包含中文或者参数包含中文,需要对中文或者特殊字符(/.&)做编码转换. urlencode的本质:把字符串转为gbk编码,再把\x替换成%.如 ...

  8. SQLSERVER中的资源调控器

    SQLSERVER中的资源调控器 转载自: http://wenku.baidu.com/view/0d92380cf78a6529647d5375.html http://www.cnblogs.c ...

  9. Prometheus Node_exporter 详解

    Basic CPU / Mem / Disk Info https://www.cnblogs.com/qianyuliang/p/10479515.html Basic CPU / Mem / Di ...

  10. leveldb源码分析--SSTable之block

    在SSTable中主要存储数据的地方是data block,block_builder就是这个专门进行block的组织的地方,我们来详细看看其中的内容,其主要有Add,Finish和CurrentSi ...