Python中的Decimal使用及说明

 更新时间:2023年10月27日 17:10:17   作者:craftsman2020  
这篇文章主要介绍了Python中的Decimal使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.可以传递给Decimal整型或者字符串参数

但不能是浮点数据,因为浮点数据本身就不准确。

# coding=utf-8
from decimal import Decimal, getcontext

# 1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。
# 传入浮点数 5.55
a = Decimal(5.55)
print('a = ', a)
a = a * 100
print('a = ', a)
# 传入字符串 ‘5.55'
b = Decimal('5.55')*100
print('b = ', b)

>>> a =  5.54999999999999982236431605997495353221893310546875
>>> a =  554.9999999999999822364316060
>>> b =  555.00

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

# 2.要从浮点数据转换为Decimal类型
c = Decimal.from_float(22.222)
print('c = ', c)

>>> c =  22.22200000000000130739863379858434200286865234375

3.getcontext().prec设置有效数字的个数

# 3.getcontext().prec设置有效数字的个数。
# 通过设定有效数字,限定结果样式
getcontext().prec = 4
x1 = Decimal(1) / Decimal(3)  # 结果为Decimal('0.3333'),四个有效数字
print('x1 = ', x1)
x2 = Decimal(100) / Decimal(3)
print('x2 = ', x2)
x3 = Decimal(700000)/Decimal(9)
print('x3 = ', x3)

>>> x1 =  0.3333
>>> x2 =  33.33
>>> x3 =  7.778E+4
# 注意:
# 如果prec的长度比数字的长度小的时候,*100得出的数就不对了
num = '88.8888'
f = Decimal(num)
print('f = ', f)
g = f * 100
print('g = ', g)
h = Decimal('999.999')
print('h = ', h)

>>> f =  88.8888
>>> g =  8889
>>> h =  999.999

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

# 4.四舍五入,保留几位小数
d = Decimal('50.5679').quantize(Decimal('0.00'))
print('d = ', d)  # 结果为Decimal('50.57'),结果四舍五入保留了两位小数

>>> d =  50.57

5.Decimal 结果转化为string

# 5.Decimal 结果转化为string
e = str(Decimal('3.40').quantize(Decimal('0.0')))
print('e = ', e)

>>> e =  3.4

6.decimal模块进行十进制数学计算

# 6.decimal模块进行十进制数学计算
i = Decimal('4.20') + Decimal('2.10') + Decimal('6.30')
print('i = ', i)

>>> i =  12.60
# 当然精度提升的同时,肯定带来的是性能的损失。在对数据要求特别精确的场合(例如财务结算),这些性能的损失是值得的。
# 但是如果是大规模的科学计算,就需要考虑运行效率了。毕竟原生的float比Decimal对象肯定是要快很多的。

7.python decimal.quantize()参数

rounding的各参数解释与行为

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)
x = Decimal('-3.1415926535') + Decimal('-2.7182818285')
print x
print x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN)
print x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN)
print x.quantize(Decimal('1.0000'), ROUND_CEILING)
print x.quantize(Decimal('1.0000'), ROUND_FLOOR)
print x.quantize(Decimal('1.0000'), ROUND_UP)
print x.quantize(Decimal('1.0000'), ROUND_DOWN)

output:
-5.8598744820
-5.8599
-5.8599
-5.8598
-5.8599
-5.8599
-5.8598

https://www.cnblogs.com/piperck/p/5843253.html
https://blog.csdn.net/weixin_37989267/article/details/79473706
  • ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默认设置值,可以通过getcontext()得到,EVENT四舍五入进了一位,DOWN为接近最近的0进了一位。
  • ROUND_CEILING 和 ROUND_FLOOR:CEILING超过5没有进位是因为它倾向正无穷,FLOOR为了总是变得更小所以进了一位。
  • ROUND_UP 和 ROUND_DOWN:UP始终进位,DOWN始终不会进位。

总结

其实这里我们通过上面一组例子可以发现,正数的行为非常可预期也非常简单,负数的情况稍复杂,有些函数就是设计为负数在某些情况中使用的。

正数中无法重现的ROUND_DOWN和ROUND_FLOOR的区别,ROUND_DOWN是无论后面是否大于5都不会管保持原状,而Floor在正数中的行为也是如此,

但是在负数中为了倾向无穷小,所以无论是否大于5,他都会变得更小而进位。

反而ROUND_UP和ROUND_DOWN的行为是最可预期的,那就是无论后面数大小,UP就进位,DOWN就始终不进位。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python 实现对文件夹内的文件排序编号

    python 实现对文件夹内的文件排序编号

    下面小编就为大家分享一篇python 实现对文件夹内的文件排序编号,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python实现通过解析域名获取ip地址的方法分析

    Python实现通过解析域名获取ip地址的方法分析

    这篇文章主要介绍了Python实现通过解析域名获取ip地址的方法,结合实例形式总结分析了两种比较常见的解析域名对应IP地址相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • 100行python代码实现跳一跳辅助程序

    100行python代码实现跳一跳辅助程序

    这篇文章主要介绍了100行代码实现跳一跳辅助程序,接下来要分享的是用“纯软件”的方法来玩“跳一跳”。本人只做过Android开发,因此下面只给出Android平台下的实现方法。需要的朋友可以参考下
    2018-01-01
  • Python异步编程中asyncio.gather的并发控制详解

    Python异步编程中asyncio.gather的并发控制详解

    在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量机制实现精准并发控制,希望对大家有所帮助
    2025-03-03
  • python 自动监控最新邮件并读取的操作

    python 自动监控最新邮件并读取的操作

    这篇文章主要介绍了python 自动监控最新邮件并读取的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python打印详细报错日志logging问题

    Python打印详细报错日志logging问题

    这篇文章主要介绍了Python打印详细报错日志logging问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python递归函数特点及原理解析

    Python递归函数特点及原理解析

    这篇文章主要介绍了Python递归函数特点及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python自动化测试pytest中fixtureAPI简单说明

    Python自动化测试pytest中fixtureAPI简单说明

    这篇文章主要为大家介绍了Python自动化测试pytest中fixtureAPI的简单说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • pycharm运行OpenCV项目踩坑记录

    pycharm运行OpenCV项目踩坑记录

    本文主要介绍了在PyCharm中运行OpenCV项目时遇到的问题及其解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 详解Numpy中的广播原则/机制

    详解Numpy中的广播原则/机制

    这篇文章主要介绍了Numpy中的广播原则/机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论