Python+decimal完成精度计算的示例详解

 更新时间:2022年10月19日 10:47:55   作者:Sir 老王  
在进行小数计算的时候使用float,经常会出现小数位不精确的情况。在python编程中,推荐使用decimal来完成小数位的精度计算。本文将通过示例详细说说decimal的使用,需要的可以参考一下

在进行小数计算的时候使用float,经常会出现小数位不精确的情况。在python编程中,推荐使用decimal来完成小数位的精度计算。

decimal是python中的标准库,直接将Decimal导入到代码块中使用。

decimal意思为十进制,这个模块提供了十进制浮点运算支持。通过几个常见的实战用例来说明一下其用法。

1. 浮点数转Decimal

使用Decimal.from_float函数将随便一个float类型的小数转换成Decimal的数据类型,结果float类型数据就显出原形了。

# It imports the Decimal class from the decimal module.
import decimal
from decimal import Decimal

# It converts the float 10.245 to a Decimal object.
decimal_ = Decimal.from_float(10.245)

print('浮点数转为Decimal后:{0}'.format(decimal_))

# 浮点数转为Decimal后:10.2449999999999992184029906638897955417633056640625

从结果来看,float浮点数转换完成以后精度位数就变得很长不是原先的三位小数了,这是因为float浮点数本身就不精确转换之后才会出现上面的效果。

2. Decimal除法设置

随机选两个整数将其定义为Decimal类型的数据,之后对这两个整个做除法通过保留相应的结果位数对其返回结果进行优化。

# It imports all the names from the decimal module into the current namespace.
from decimal import *

# It sets the precision of the decimal module to 8.
getcontext().prec = 8

# Dividing 1 by 6 and storing the result in the variable `decimal_`.
decimal_ = Decimal(1)/Decimal(6)

print('精确到8位小数后的结果是:{0}'.format(decimal_))

# 精确到8位小数后的结果是:0.16666667

很明显做除法以后的结果应该是一个无限小数,设置保留8位小数之后自动进行了四舍五入的计算得到0.16666667的结果。

3. Quantize设置结果

同样是保留了两位小数,使用quantize函数能完成同样的效果,默认结果也是经过了四舍五入的计算,若是想要固定小数位数使用此方法比较靠谱。

# It imports all the names from the decimal module into the current namespace.
from decimal import *

# Rounding the number 3.7829 to two decimal places.
decimal_ = Decimal('3.7829').quantize(Decimal('0.00'))

print('quantize设置保留两位小数后的结果:{0}'.format(decimal_))

# quantize设置保留两位小数后的结果:3.78

4. Decimal精度设置

这里还是做一个结果为无限小数的除法,分别使用向上取整、向下取整的方式保留一定位数的小数来说明问题。

一般情况下可能使用的都是向上取整,但是在一些领域比较金融、证券行业就必须采取向下取整的方式,首先来看一下常用的向上取整的方式来保留小数。

# It imports all the names from the decimal module into the current namespace.
from decimal import *

# It sets the rounding mode to ROUND_CEILING.
getcontext().rounding = getattr(decimal, 'ROUND_CEILING')

# It sets the precision of the decimal module to 10.
getcontext().prec = 10

# Converting the integer 9 to a string and then converting it to a Decimal object.
decimal_ = Decimal(1) / Decimal(str(9))

print('向上取整保留10位小数:{0}'.format(decimal_.quantize(Decimal('0.0000000000'))))

# 向上取整保留10位小数:0.1111111112

这里有个问题就是,如果getcontext().prec已经设置小数位是10,那么在使用quantize函数固定小数位的时候就必须不超过10位才行,也就是不能超过有效位数否则就会报错。

接下来看一下向下取整,向下取整的小数保留方式只需要修改getcontext().rounding的属性为向下取整即可,为了对比结果我们还是采用同样的数据来看看效果。

# It imports all the names from the decimal module into the current namespace.
from decimal import *

# It sets the rounding mode to ROUND_CEILING.
getcontext().rounding = getattr(decimal, 'ROUND_FLOOR')

# It sets the precision of the decimal module to 10.
getcontext().prec = 10

# Converting the integer 9 to a string and then converting it to a Decimal object.
decimal_ = Decimal(1) / Decimal(str(9))

print('向下取整保留10位小数:{0}'.format(decimal_.quantize(Decimal('0.0000000000'))))

# 向下取整保留10位小数:0.1111111111

可以发现同样的数据做除法,向下取整时结果是0.1111111111,向上取整时结果是0.1111111112。

同样,还是很多的其他保留小数的方式可以使用比如四舍五入的方式,这也是很多很多行业会采取的一种小数保留的方式,再演示一下四舍五入时的保留小数。

# It imports all the names from the decimal module into the current namespace.
from decimal import *

# It sets the rounding mode to ROUND_HALF_UP.
getcontext().rounding = getattr(decimal, 'ROUND_HALF_UP')

# It sets the precision of the decimal module to 4.
getcontext().prec = 5

# It converts the string '3.14159' to a Decimal object.
decimal_ = Decimal('3.14159')

print('四舍五入保留4位小数:{0}'.format(decimal_.quantize(Decimal('0.0000'))))

# 四舍五入保留4位小数:3.1416

将3.14159通过四舍五入的方式保留4位小数之后就变成了3.1416,和我们预想的结果一样。

到此这篇关于Python+decimal完成精度计算的示例详解的文章就介绍到这了,更多相关Python decimal精度计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django与JS交互的示例代码

    Django与JS交互的示例代码

    本篇文章主要介绍了Django与JS交互的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • python中pyc、 pyd文件及生成使用完整实例代码

    python中pyc、 pyd文件及生成使用完整实例代码

    这篇文章主要介绍了python中pyc、 pyd文件及生成使用的相关资料,重点讲解了如何使用Python解释器编译.py文件为.pyc文件,以及如何使用Cython和distutils工具将C/C++代码编译为.pyd文件,需要的朋友可以参考下
    2025-04-04
  • Python内置的HTTP协议服务器SimpleHTTPServer使用指南

    Python内置的HTTP协议服务器SimpleHTTPServer使用指南

    这篇文章主要介绍了Python内置的HTTP协议服务器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分简单,文中介绍了需要的朋友可以参考下
    2016-03-03
  • 基于Python 装饰器装饰类中的方法实例

    基于Python 装饰器装饰类中的方法实例

    下面小编就为大家分享一篇基于Python 装饰器装饰类中的方法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python虚拟环境virtualenv的使用教程

    python虚拟环境virtualenv的使用教程

    本篇文章主要介绍了python虚拟环境virtualenv的使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python实现Url地址截取的方法

    Python实现Url地址截取的方法

    在网络编程和数据处理过程中,解析 URL 并提取其各个部分是一个常见的需求,URL是用于定位互联网上资源的地址,本文将详细介绍如何使用 Python 编写一个函数,实现Url地址截取,需要的朋友可以参考下
    2025-03-03
  • 详解如何使用python实现猜数字游戏

    详解如何使用python实现猜数字游戏

    “猜数字”游戏是一款简单而有趣的小游戏,玩家需要在给定的范围内猜出一个由计算机随机生成的数字,本文将使用Python语言来实现这款游戏,并详细介绍其实现过程,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-04-04
  • Python中循环依赖问题及其解决方案

    Python中循环依赖问题及其解决方案

    在软件开发中,循环依赖是一个常见的问题,尤其是在使用 Python 这样的动态语言时,循环依赖指的是两个或多个模块或组件相互依赖,形成一个闭环,本文将探讨 Python 中循环依赖的问题,并提供一些解决方案,需要的朋友可以参考下
    2024-06-06
  • python实现数据结构中双向循环链表操作的示例

    python实现数据结构中双向循环链表操作的示例

    这篇文章主要介绍了python实现数据结构中双向循环链表操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python非对称加密算法RSA实现原理与应用详解

    python非对称加密算法RSA实现原理与应用详解

    RSA加密算法是一种非对称加密算法,RSA算法的安全性基于大数分解的困难性,即已知两个大素数p和q的乘积n,求解p和q非常困难,RSA算法广泛应用于数据加密和数字签名等领域,本文将详细介绍如何在Python中使用RSA算法进行加密和解密,需要的朋友可以参考下
    2024-09-09

最新评论