Python+decimal完成精度计算的示例详解
作者:Sir 发布时间:2022-09-18 11:07:35
在进行小数计算的时候使用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,和我们预想的结果一样。
来源:https://mp.weixin.qq.com/s/P1wapmw96-aFG1iULR9VlA
猜你喜欢
- 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般
- 代码如下:'===================================== '转换内容,防止意外 '==
- 起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到selenium,所以选择了pyqt5的方式来开发这个C/S架构的客
- 异常处理简介在我们写程序代码的时候,往往会因一个小问题让我们整个程序直接挂掉。异常处理对我们测试有什么好处,相信做过自动化的同学都知道我们的
- 本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下刚开始学习tf时,我们从简单的地方开始。卷积神经网络(C
- 1.python实现对doc文档的读取#读取docx中的文本代码示例import docx#获取文档对象file=docx.Document
- 使用方法:terminal中输入python weather.py http://www.weather.com.cn/weather/10
- set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。set 语法:class set([it
- python中.split()只能用指定一个分隔符例如:text='3.14:15'print text.split(
- 一、python-yml文件读写使用库 :import yaml安装:pip install pyyaml示例:文件config2.ymlg
- (一)问题遗传算法求解正方形拼图游戏(二)代码#!/usr/bin/env python# -*- coding: utf-8 -*-fro
- language.xml 代码如下:<?xml version="1.0" encoding=
- 1.安装依赖包 pip install channels channels-redis2.settings.py 修改加上支持INSTALL
- 很久之前就对jQuery.animate的实现非常感兴趣,不过前段时间很忙,直到前几天端午假期才有时间去研究。jQuery.animate的
- 前言:要说小时候称霸所有翻盖手机的小游戏,除了贪吃蛇,那就是推箱子了。控制小人将所有箱子放到指定位置,就是这样简简单单的操作,陪伴我度过了无
- 目录简介实现原理源码运行结果简介大家都知道在微信朋友圈或者微博以及QQ动态中,有很多“强迫症患者”发图片都爱发9张,而有些图是一张图片分成的
- 本文为大家讲解了python算法表示概念,供大家参考,具体内容如下常数阶O(1)常数又称定数,是指一个数值不变的常量,与之相反的是变量为什么
- Python的from import *和from import *,它们的功能都是将包引入使用,但是它们是怎么执行的以及为什么使用这种语法
- 第一段代码:#!/usr/bin/python# -*- coding: utf-8 -*-import emailimport mimet
- 在原txt文件中,我们需要匹配出的字符串为:休闲服务(中间参杂着换行)直接复制到notebook里进行处理①发现需要拿出的字符串都在证卷研究