Python decimal模块使用方法详解


Posted in Python onJune 08, 2020

decimal 模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持

1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。

2.要从浮点数据转换为Decimal类型

from decimal import *
Decimal.from_float(12.222)
# 结果为Decimal('12.2219999999999995310417943983338773250579833984375')

3.通过设定有效数字,限定结果样式

from decimal import *
getcontext().prec = 6
Decimal(1)/Decimal(7)
# 结果为Decimal('0.142857'),六个有效数字

4.四舍五入,保留几位小数

from decimal import *
Decimal('50.5679').quantize(Decimal('0.00'))
# 结果为Decimal('50.57'),结果四舍五入保留了两位小数

5.Decimal 结果转化为string

from decimal import *
str(Decimal('3.40').quantize(Decimal('0.0')))
# 结果为'3.4',字符串类型

Python3中decimal处理计算精度问题示例

#!/usr/bin/python3
# coding:utf-8
import decimal
from decimal import Decimal, getcontext

def demo():
  """
  取整问题:
  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取整
  """

  # 1.常规计算
  getcontext().prec = 9
  r1 = Decimal(1) / Decimal(3)
  print("r1 ", r1) # r1 0.333333333

  # 2.但是getcontext().prec会包含小数点前面的所有长度,当前面长度有变化时并不能固定控制小数点后的位数
  r2 = Decimal(10) / Decimal(3)
  print("r2 ", r2) # r2 3.33333333

  # 3.想要固定控制小数点后面的位数则需要使用decimal.quantize(Decimal('0.00000000')),注意不能超过getcontext().prec的位数
  r3 = Decimal(1) / Decimal(3)
  print("r3 ", r3.quantize(Decimal('0.00000000'))) # r3 0.33333333
  r4 = Decimal(10) / Decimal(3)
  print("r4 ", r4.quantize(Decimal('0.00000000'))) # r4 3.33333333
  r5 = Decimal(10) / Decimal(str(1.5))
  print("r5 ", r5.quantize(Decimal('0.00000000'))) # r5 6.66666667

  # 4.向上取整
  getcontext().rounding = getattr(decimal, 'ROUND_CEILING') # 总是趋向无穷大向上取整
  r6 = Decimal(10) / Decimal(str(1.5)) # r6 6.66666667
  print("r6 ", r6.quantize(Decimal('0.00000000')))
  r7 = Decimal(10) / Decimal(3) # r7 3.33333334
  print("r7 ", r7.quantize(Decimal('0.00000000')))

  # 5.向下取整
  getcontext().rounding = getattr(decimal, 'ROUND_FLOOR') # 总是趋向无穷大向下取整
  r8 = Decimal(10) / Decimal(str(1.5)) # r8 6.66666666
  print("r8 ", r8.quantize(Decimal('0.00000000')))
  r9 = Decimal(10) / Decimal(3) # r9 3.33333333
  print("r9 ", r9.quantize(Decimal('0.00000000')))

if __name__ == '__main__':
  demo()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
深入理解python对json的操作总结
Jan 05 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
python使用 request 发送表单数据操作示例
Sep 25 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python中常见的数制转换有哪些
May 27 Python
Python爬虫requests库多种用法实例
May 28 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
python中字符串的编码与解码详析
Dec 03 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
深入了解python列表(LIST)
Jun 08 #Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 #Python
基于python实现matlab filter函数过程详解
Jun 08 #Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 #Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 #Python
win10下python3.8的PIL库安装过程
Jun 08 #Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 #Python
You might like
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
php检测文本的编码
2015/07/26 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
JavaScript URL参数读取改进版
2009/01/16 Javascript
web前端开发也需要日志
2010/12/09 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue入门之animate过渡动画效果
2018/04/08 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
vue实现二级导航栏效果
2019/10/19 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Python requests上传文件实现步骤
2020/09/15 Python
python requests库的使用
2021/01/06 Python
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
工商企业管理专业自荐信范文
2014/04/12 职场文书
公司股东合作协议书
2014/09/14 职场文书
发布会邀请函
2015/01/31 职场文书
门卫岗位职责
2015/02/09 职场文书
警示教育观后感
2015/06/17 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
详解TypeScript的基础类型
2022/02/18 Javascript