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标准算法实现数组全排列的方法
Mar 17 Python
Python import用法以及与from...import的区别
May 28 Python
Python卸载模块的方法汇总
Jun 07 Python
python利用Guetzli批量压缩图片
Mar 23 Python
pandas计算最大连续间隔的方法
Jul 04 Python
Python中print函数简单使用总结
Aug 05 Python
python3实现高效的端口扫描
Aug 31 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python文件路径操作方法总结
Dec 21 Python
python里glob模块知识点总结
Jan 05 Python
Python基础之Socket通信原理
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批量删除数据
2007/01/18 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
Array对象方法参考
2006/10/03 Javascript
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python实现海螺图片的方法示例
2019/05/12 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
大班开学家长寄语
2014/04/04 职场文书
《恐龙》教学反思
2014/04/27 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
无工作证明怎么写
2015/06/15 职场文书
教师师德工作总结2015
2015/07/22 职场文书