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精度计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python函数参数和注解的使用

    Python函数参数和注解的使用

    本文介绍了Python函数的四种参数:定位参数、可变参数、默认值参数、关键字参数,和第五种Python3新特性参数:仅限关键字参数。函数注解是一种元数据,存在__annotations__属性中,备注函数的参数和返回值的类型,它只是个注解,Python不会做任何强制检查。
    2021-06-06
  • 深入探究Python Numba库编译优化利器

    深入探究Python Numba库编译优化利器

    这篇文章主要为大家介绍了Python Numba库编译优化利器深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python中的for循环详情

    Python中的for循环详情

    这篇文章主要介绍了Python中的for循环,for语句实际上解决的是循环问题。在很多的高级语言中都有for循环(for loop)。下面就来简单给大家介绍Python中的for循环的相关资料,需要的朋友可以参考一下
    2021-10-10
  • python中.format()方法使用详解

    python中.format()方法使用详解

    这篇文章主要介绍了python中.format()方法使用详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • 使用Python Cupy模块加速大规模数值计算实例深究

    使用Python Cupy模块加速大规模数值计算实例深究

    Cupy是一个基于NumPy的库,专门设计用于在GPU上进行高性能计算,它提供了与NumPy相似的API,因此用户可以很容易地将现有的NumPy代码迁移到Cupy上,从而充分利用GPU的并行计算能力
    2023-12-12
  • Python中栈、队列与优先级队列的实现方法

    Python中栈、队列与优先级队列的实现方法

    这篇文章主要给大家介绍了关于Python中栈、队列与优先级队列的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Pycharm导包失败问题及解决

    Pycharm导包失败问题及解决

    这篇文章主要介绍了Pycharm导包失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 使用keras内置的模型进行图片预测实例

    使用keras内置的模型进行图片预测实例

    这篇文章主要介绍了使用keras内置的模型进行图片预测实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • TensorFlow实现非线性支持向量机的实现方法

    TensorFlow实现非线性支持向量机的实现方法

    本篇文章主要介绍了TensorFlow实现非线性支持向量机的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Dlib+OpenCV深度学习人脸识别的方法示例

    Dlib+OpenCV深度学习人脸识别的方法示例

    这篇文章主要介绍了Dlib+OpenCV深度学习人脸识别的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论