返回顶部
首页 > 资讯 > 后端开发 > Python >python中decimal模块的用法
  • 268
分享到

python中decimal模块的用法

pythondecimal模块pythondecimal 2023-02-19 18:02:39 268人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1. Decimal类型的优点2. decimal模块的构成3. context4. Signals5. Round类型查看python3.4.1文档,发现对于decimal模块

查看python3.4.1文档,发现对于decimal模块的讲解非常多,由此可见其功能也很强大(下面算是把我认为比较重要的半翻译学习吧~)。文档关于decimal模块的总解释是Decimal fixed point and floating point arithmetic,我理解的是固定小数点和浮点运算。头加上from decimal import * 即可调用decimal模块中的内容。

1. Decimal类型的优点

Decimal类型是在浮点类型的基础上设计的,但是它在几个地方上要优于floating point:

1)Decimal类型可以非常精确地在计算机中存储,而学过c++的都知道,浮点型在计算机中是无法精确存储的,比如1.1和2.2在计算机中存储后,运算(1.1+2.2)表达式的值结果会是3.3000000000000003;Decimal类型则不会出现这种情况。同样,由于无法精确存储,浮点型也就无法精确计算(相对于Decimal类型),可以再测试(0.1+0.1+0.1-0.3)两种类型的计算结果。

2)Decimal类型会自动保留小数点后面不需要的0,以与输入的精度相匹配,比如下面小程序中的例子:浮点型的1.20+1.30结果是2.5;而Decimal类型结果是2.50,这样貌似比较人性化。

3)Decimal类型可以根据需要自己设置小数点后精度。通过getcontext().prec = x (x为你想要的精度来设置,getcontext()函数下面再详细介绍)。

4)Decimal类型有很强的管理功能,它能够根据需要设置,来控制输出的格式,得到或者忽略某类错误(如除0,可以设置忽略它,而得到一个Infinity的Decimal值)。

#difference between float and decimal
print(1.1+2.2)                    #3.3000000000000003
print (Decimal('1.1')+Decimal('2.2'))  #3.3
  
print (0.1+0.1+0.1-0.3)    #5.551115123125783e-17
print (Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')) # 0.0
 
print (1.20+1.30)                         #2.5
print (Decimal('1.20')+Decimal('1.30'))   #2.50

需要注意的是,Decimal()的构造中如果是小数或字符的话,需要加上单引号;如果为整数,则不需要。

2. decimal模块的构成

文档说,decimal模块主要由三部分构成:the decimal number ,the context of arithmetic ,signals 。

1)decimal number是不可改变的常量,它也不会截取小数点后多余的0;除了正常的数外, 它还包括'Infinity','-Infinity','NaN'等数。

2)the context of arithmetic是当前计算环境的一些参数,包括精度位数prec,舍弃位数规则rounding,指数的最大值最小值Emin、Emax,科学计数法e的大小写Capitals,指数是否超出范围clamped,运算结果的标志flags,哪些操作要触发traps等。

3)signals是在运算过程中产生的一些状态,这些状态可以根据需要用来提示、忽略、报错等。
signals和flags、traps是对应的,假设运算过程中产生了除0这样一个状态,那么flags中就会产生一个DivisionByZero为1这样的信息,接着如果在traps中包含这个操作,那么python就会报个异常出来。这样一个处理机制,可以人为的设置自己需要的信息或异常提示,而把另外一些忽略。

3. context

可以用getcontext()函数得到当前运算环境的参数,直接打印 print (get context()),以我的为例子

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, Overflow, DivisionByZero])
其中,prec精度为28,是默认值,可以通过getcontext().prec = 10这样来设置自己想要的精度;rounding的规则是ROUND_HALF_EVEN (具体下面介绍),此外还有其他一些规则,感兴趣的可以查阅文档或自己测试;traps数组表明当前如果出现这三种状态会报异常。当然,其中的参数都可以自己修改。

值得一提的是,精度值的修改只在运算中才会体现出来,比如精度是5,输入Decimal(’1.222222222‘),输出仍然是这个数;但是Decimal('1.222222222') + Decimal('1.11111111') 的结果精度就为6了。

除了可以通过getcontext().prec这样来修改context的参数,还可以使用setcontext()来一次性设置context。如下:

mycontext = Context(prec=18, rounding=ROUND_HALF_DOWN)
setcontext(mycontext)

这里再学习一个比较有用的函数quantize(),当我们希望在运算过程中保持较高的精度,而在结果中以某种方式保留几位小数时可以用这个函数,下面是官网文档的示例:

Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')  #result
Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
Decimal('8')     #result

4. Signals

decimal模块中提供了10种signals,下面简单介绍一下:

1)Clamped:越界,指数超出Emin或Emax范围;如果发生,则会在小数部分添加0来表示;

2)DecimalException;

3)DivisionByZero:在除法运算中出现,除数为0;如果不捕捉该错误,则返回Infinity或-Infinity;

4)Inexact:不精确,使用round函数舍弃的小数部分中包含除0以外的数字;

5)InvalidOperation:无效计算或计算无意义,比如两个无穷大相减等;如果不捕捉该错误,则返回NaN(Not a Number);

6)Overflow:在round后指数超出Emax范围,如果不捕捉,则根据round规则来判断返回什么值;

7)Rounded:如果round操作舍弃了小数,不管是不是0,都发生;如果不捕捉,则返回 值未改变;

8)SubnORMal:指数值过小;如果不捕捉,则返回  值不变; 

9)Underflow:指数值太小,且round操作向0逼近;

10)FloatOperation:如果不捕捉,则混合float型和Decimal型的操作可以执行;如果捕捉,则只有相等判断和显式转换可以执行,其余的都报错。

5. Round类型

Decimal中大致有以下几种类型,做简单介绍一下,如有错误,希望指正:

1)ROUND_UP:舍弃小数部分非0时,在前面增加数字,如 5.21 -> 5.3;

2)ROUND_DOWN:舍弃小数部分,从不在前面数字做增加操作,如5.21->5.2;

3)ROUND_CEILING:如果Decimal为正,则做ROUND_UP操作;如果Decimal为负,则做ROUND_DOWN操作;

4)ROUND_FLOOR:如果Decimal为负,则做ROUND_UP操作;如果Decimal为正,则做ROUND_DOWN操作;

5)ROUND_HALF_DOWN:如果舍弃部分>.5,则做ROUND_UP操作;否则,做ROUND_DOWN操作;

6)ROUND_HALF_UP:如果舍弃部分>=.5,则做ROUND_UP操作;否则,做ROUND_DOWN操作;

7)ROUND_HALF_EVEN:如果舍弃部分左边的数字是奇数,则做ROUND_HALF_UP操作;若为偶数,则做ROUND_HALF_DOWN操作;

#test Round rules
 
#ROUND_UP & ROUND_DOWN
print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_UP))  #8.54
print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_UP)) #-8.54
print (Decimal('8.530').quantize(Decimal('0.01'), rounding=ROUND_UP))  #8.53
 
print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_DOWN))  #8.53
print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_DOWN)) #8.53
 
#ROUND_CEILING & ROUND_FLOOR
print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_CEILING)) #8.54
print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_CEILING))#-8.53
 
print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_FLOOR)) #8.53
print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_FLOOR)) #-8.54
 
#ROUND_HALF_
print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) #8.54
print (Decimal('8.534').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) #8.53
 
print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.53
print (Decimal('8.534').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.53
print (Decimal('8.536').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.54
 
print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)) #8.54
print (Decimal('8.545').quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)) #8.54

decimal模块先简单了解到这里,还有许多函数,后面如果用到,再查阅文档。

到此这篇关于Python中decimal模块的用法的文章就介绍到这了,更多相关python decimal模块内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中decimal模块的用法

本文链接: https://lsjlt.com/news/196751.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中decimal模块的用法
    目录1. Decimal类型的优点2. decimal模块的构成3. context4. Signals5. Round类型查看python3.4.1文档,发现对于decimal模块...
    99+
    2023-02-19
    python decimal模块 python decimal
  • python中的decimal模块如何使用
    本篇内容主要讲解“python中的decimal模块如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中的decimal模块如何使用”吧!1. Decimal类型的优点Decim...
    99+
    2023-07-05
  • python中decimal模块的具体使用
    decimal模块主要的作用是精确小数,因为float是不精确的,只是无限接近,对于一些需要精确小数点后位数的就需要用decimal。 Decimal类型的优点 Decimal类型是...
    99+
    2023-01-29
    python decimal模块 python decimal
  • python中decimal模块怎么使用
    这篇文章主要介绍了python中decimal模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中decimal模块怎么使用文章都会有所收获,下面我们一起来看看吧。查看python3.4.1...
    99+
    2023-07-05
  • python数学模块(math/decimal模块)
    目录一, math模块2. math库常用函数3.math库使用示例二, decimal模块1. 什么时候使用decimal2. 使用decimal3. decimal使用示例一, ...
    99+
    2024-04-02
  • Python decimal模块如何使用
    这篇文章主要介绍“Python decimal模块如何使用”,在日常操作中,相信很多人在Python decimal模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python&...
    99+
    2023-07-05
  • Python中模块的使用--binascii模块用法
    目录binascii模块用法binascii模块和进制转换笔记 Python内置函数binascii模块用法 binascii模块用于在二进制和ASCII之间转换 >...
    99+
    2024-04-02
  • python中decimal用法详解
    decimal是python内置库。 decimal模块支持快速正确四舍五入的十进制浮点运算。 示例代码: import decimala = decimal.Decimal(123)print(a)b = decimal.Decimal(...
    99+
    2023-09-12
    python decimal
  • Python中的itertools模块的用法
    本篇内容主要讲解“Python中的itertools模块的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的itertools模块的用法”吧!在Python中有一个功能强大的迭代...
    99+
    2023-06-16
  • python中os模块用法
    python 中的 os 模块提供与操作系统交互的接口,其核心功能包括文件和目录操作、环境变量处理、进程控制和系统信息查询。使用方法为先导入模块 import os,然后使用相关函数,例...
    99+
    2024-05-15
    python
  • Python中的time模块与datetime模块用法总结
    time模块 time模块是包含各方面对时间操作的函数. 尽管这些常常有效但不是所有方法在任意平台中有效. time用struct_time表示时间 import time # time.struct...
    99+
    2022-06-04
    模块 Python time
  • Python中time模块和datetime模块的用法示例
    time模块方法: time.time():获取当前时间的时间戳 time.localtime():接受一个时间戳,并把它转化为一个当前时间的元组。不给参数的话就会默认将time.time()作为参数传入 ...
    99+
    2022-06-04
    模块 示例 Python
  • Python中的Beautiful Soup模块的用法
    这篇文章主要介绍“Python中的Beautiful Soup模块的用法”,在日常操作中,相信很多人在Python中的Beautiful Soup模块的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pyt...
    99+
    2023-06-02
  • mysql中decimal的用法
    mysql decimal 数据类型用于存储精确十进制数字,专为金融和其他需要高精度的计算而设计。其语法为 decimal(precision, scale),其中 precision ...
    99+
    2024-05-09
    mysql
  • sql中decimal的用法
    sql 中的 decimal 数据类型用于存储精确的十进制数字。它具有以下语法:decimal(precision, scale),其中 precision 是总位数,scale 是小数...
    99+
    2024-05-02
  • Python中os模块的实例用法
    1、说明 os.path.exists():用于判断某个路径(文件或文件夹)是否存在,若存在则返回True,若不存在则返回False。 os.makedirs():用于创建文件夹。传入所欲创建的文件夹的路径即可,没有...
    99+
    2022-06-02
    Python os模块
  • 详解Python中heapq模块的用法
    heapq 模块提供了堆算法。heapq是一种子节点和父节点排序的树形数据结构。这个模块提供heap[k] <= heap[2*k+1] and heap[k] <= heap[2*k+2]。为...
    99+
    2022-06-04
    详解 模块 Python
  • python中elasticsearch_dsl模块的使用方法
    目录前言连接elasticsearchelasticsearch_dsl.Searchquery方法filter方法index方法elasticsearch_dsl.queryela...
    99+
    2024-04-02
  • python中sys模块的使用方法
    小编给大家分享一下python中sys模块的使用方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted...
    99+
    2023-06-14
  • Python中concurrent.futures模块的使用方法
    这篇文章主要介绍了Python中concurrent.futures模块的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明标准库为我们提供了concurrent...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作