Python 高精度计算利器:decimal 模块详解

Python 高精度计算利器:decimal 模块详解

在 Python 编程中,处理浮点数时,标准的 float 类型往往会因二进制表示的特性而产生精度问题。decimal 模块应运而生,它提供了十进制浮点运算功能,能让开发者在需要高精度计算的场景下,精确控制小数位数、舍入规则等。本文将围绕 https://docs.python.org/zh-cn/3.12/library/decimal.html 详细介绍 decimal 模块,涵盖其基本概念、常用类和方法、应用场景等内容,助你全面掌握高精度计算技巧。

文章目录

  • Python 高精度计算利器:`decimal` 模块详解
    • 一、`decimal` 模块基础概念
      • (一)十进制浮点运算的必要性
      • (二)上下文(Context)
    • 二、`Decimal` 类
      • (一)创建 `Decimal` 对象
      • (二)`Decimal` 对象的属性和方法
    • 三、舍入规则
    • 四、算术运算
    • 五、比较运算
    • 六、应用场景
      • (一)金融计算
      • (二)科学计算
    • 文章总结
    • TAG: Python、decimal 模块、高精度计算、十进制浮点运算、舍入规则
    • 相关学习资源

一、decimal 模块基础概念

(一)十进制浮点运算的必要性

Python 的内置 float 类型采用二进制浮点数表示,在处理一些十进制小数时会出现精度丢失问题。例如:

print(0.1 + 0.2)  

输出结果为 0.30000000000000004,而非预期的 0.3。这是因为二进制无法精确表示某些十进制小数,而 decimal 模块使用十进制表示,能避免此类问题。

(二)上下文(Context)

decimal 模块中的上下文定义了精度、舍入规则等计算环境。有全局上下文和本地上下文之分:

  • 全局上下文:通过 getcontext()setcontext() 函数进行操作。全局上下文影响整个程序中的 decimal 计算。
import decimal
context = decimal.getcontext()
print(context.prec)  # 输出当前全局精度
context.prec = 10  # 设置全局精度为 10
decimal.setcontext(context)
  • 本地上下文:使用 localcontext() 函数创建临时上下文,只在其作用域内生效。
with decimal.localcontext() as ctx:ctx.prec = 5  # 设置本地精度为 5# 在这个 with 块内的计算使用本地上下文result = decimal.Decimal('1') / decimal.Decimal('3')print(result)

二、Decimal

(一)创建 Decimal 对象

Decimal 类是 decimal 模块的核心,用于表示十进制数。可以通过多种方式创建 Decimal 对象:

  1. 从整数创建
import decimal
num1 = decimal.Decimal(5)
print(num1)  
  1. 从字符串创建:推荐使用这种方式,能避免二进制浮点数精度问题。
num2 = decimal.Decimal('0.1')
print(num2)  
  1. 从浮点数创建:但不建议这样做,因为浮点数本身可能存在精度问题。
num3 = decimal.Decimal(0.1)
print(num3)  

(二)Decimal 对象的属性和方法

  1. 属性
    • sign:返回数的符号,0 表示正数,1 表示负数。
    • digits:返回数字的位数。
    • exponent:返回指数部分。
num = decimal.Decimal('-123.45')
print(num.sign)  
print(num.digits)  
print(num.exponent)  
  1. 方法
    • quantize():对 Decimal 对象进行舍入操作,指定精度。
num = decimal.Decimal('1.2345')
rounded_num = num.quantize(decimal.Decimal('0.01'))
print(rounded_num)  
  • sqrt():计算平方根。
num = decimal.Decimal('4')
sqrt_num = num.sqrt()
print(sqrt_num)  

三、舍入规则

decimal 模块提供了多种舍入规则,可在上下文或 quantize() 方法中指定:

舍入规则描述
ROUND_CEILING向正无穷方向舍入
ROUND_DOWN向零方向舍入
ROUND_FLOOR向负无穷方向舍入
ROUND_HALF_DOWN四舍五入,当最后一位是 5 时向下舍入
ROUND_HALF_EVEN银行家舍入法,当最后一位是 5 时,舍入到最接近的偶数
ROUND_HALF_UP四舍五入,当最后一位是 5 时向上舍入
ROUND_UP远离零方向舍入
ROUND_05UP当最后一位是 0 或 5 时远离零方向舍入

示例:

import decimal
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP  # 设置舍入规则为四舍五入
num = decimal.Decimal('1.25')
rounded_num = num.quantize(decimal.Decimal('0.1'))
print(rounded_num)  

四、算术运算

Decimal 对象支持常见的算术运算,如加、减、乘、除等,运算结果也是 Decimal 对象:

import decimal
a = decimal.Decimal('1.2')
b = decimal.Decimal('0.3')
# 加法
add_result = a + b
print(add_result)  
# 减法
sub_result = a - b
print(sub_result)  
# 乘法
mul_result = a * b
print(mul_result)  
# 除法
div_result = a / b
print(div_result)  

五、比较运算

Decimal 对象可以进行比较运算,返回布尔值:

import decimal
a = decimal.Decimal('1.2')
b = decimal.Decimal('0.3')
print(a > b)  
print(a == b)  

六、应用场景

(一)金融计算

在金融领域,对精度要求极高,如货币计算、利率计算等。使用 decimal 模块可以避免因精度问题导致的财务误差。

import decimal
principal = decimal.Decimal('1000')
rate = decimal.Decimal('0.05')
interest = principal * rate
print(interest)  

(二)科学计算

在一些科学实验和数据分析中,需要精确的小数计算,decimal 模块能满足高精度计算的需求。

文章总结

decimal 模块为 Python 提供了强大的十进制浮点运算能力,通过 Decimal 类和上下文管理,开发者可以精确控制计算精度和舍入规则,避免二进制浮点数带来的精度问题。在金融计算、科学计算等对精度要求较高的场景中,decimal 模块是不可或缺的工具。掌握 decimal 模块的使用,能提升程序的准确性和可靠性。

TAG: Python、decimal 模块、高精度计算、十进制浮点运算、舍入规则

相关学习资源

  • Python 官方文档:https://docs.python.org/zh-cn/3.12/library/decimal.html 官方文档是学习 decimal 模块最权威的资料,详细介绍了模块的各个方面,包括类、方法、上下文、舍入规则等,还有丰富的示例代码和详细解释。

  • 《Python 数据分析实战》 该书包含了 Python 在数据分析领域的各种应用,其中有关于 decimal 模块在金融数据处理和科学数据分析中的实际案例,有助于读者理解模块在实际项目中的应用。

  • Tekin的Python编程秘籍库: Python 实用知识与技巧分享,涵盖基础、爬虫、数据分析等干货 本 Python 专栏聚焦实用知识,深入剖析基础语法、数据结构。分享爬虫、数据分析等热门领域实战技巧,辅以代码示例。无论新手入门还是进阶提升,都能在此收获满满干货,快速掌握 Python 编程精髓。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

freertos 学习5--链路状态设置

以下三个函数都是针对网卡netif的操作。1 netif_set_up函数(netif_set_down) 特点 直接操作网络接口,不通过 netifapi 机制。 适用于单线程环境,或者在多线程环境中需要额外加锁。1.1 netif_set_up 对比windows下面,相当于是在资源管理器中…

基于大数据的民宿旅馆消费数据分析系统

【大数据】基于大数据的民宿旅馆消费数据分析系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统可以揭示民宿市场的消费模式和价格分布情况,帮助理解消费者偏好、价格走势及…

线程池的介绍

线程池的分类 FixedThreadPool: 固定线程池:线程池中的线程数量固定,这些线程会一直存在,不会随任务的增 加或减少而动态调整,超出的任务会在队列中等待。 使用场景:任务量比较固定但耗时较长的任务。 CachedThreadPo…

[特殊字符]【CVPR2024新突破】Logit标准化:知识蒸馏中的自适应温度革命[特殊字符]

文章信息 题目:Logit Standardization in Knowledge Distillation论文地址:paper代码地址:code年份:2024年发表于CVPR 文章主题 文章的核心目标是改进知识蒸馏(KD)中的一个关键问题:传统KD方…

CAM350_安装

版本:V14.5 一、安装 打开.exe文件 选择不重启,然后再打开这个.exe 再来一次类似的操作 二、配置 复制patch文件夹中的这三个 ,粘贴到掉安装目录中 设置ACT_INC_LICENSE_FILE用户环境变量来设置license管理 打开电脑的环境变量 破解完毕&am…

「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」

Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时,操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能,让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…

mysqldump 参数详解

mysqldump 是一个用于备份 MySQL 数据库的工具。它可以生成一组 SQL 语句,这些语句可以用来重现原始数据库对象定义和表数据。以下是一些常用的 mysqldump 参数及其详细解释: 常用参数 基本参数 --host=host_name, -h host_name: 指定 MySQL 数据库主机地址,默认为 localh…

【AD】3-9 物料BOM表的设置与导出

1.报告—… 2.筛选导出内容 3.进行选择导出格式 官方模板 亦可以自行修改其模板,AD官方的BOM表模板在安装目录下的Templates文件夹下(C:\Users\Public\Documents\Altium\AD24\Templates)

数据结构——布隆过滤器

目录 布隆过滤器概念 布隆过滤器实现 哈希函数 布隆过滤器类 加入到布隆过滤器 判断在不在 测试一下 为啥不写删除? 测试一下误判率 布隆过滤器概念 布隆过滤器也是一种位图结构,它可以快速的判断字符串在不在位图中。它的优点是节省空间。 …

C++题解(31) 2025顺德一中少科院信息学创新班(四期)考核:U537296 青蛙的距离 题解

(本人参与了这次考核) 题目背景 有n个池塘,每个池塘中有m只青蛙。这里的青蛙很奇怪,同一个池塘的青蛙喜欢排成一列,并且他们的位置都是有序的。 对于第i列的青蛙,他们分别在第a[i]个位置。 青蛙的距离定义…

软件工程复试专业课-测试

测试 1 软件质量2 黑盒测试2.1 概念2.2 等价划分类 2.3 边值分析2.4 错误推测2.5 因果图 3 白盒测试3.1概念3.2 覆盖标准3.2.1 语句覆盖3.2.2 判断覆盖3.2.3 条件覆盖3.2.4 判定/条件覆盖3.2.5 条件组合覆盖3.2.6 路径覆盖 4 软件测试的四个阶段5 测试工具 1 软件质量 定义&…

物以类聚的Kmeans:数据分群的暴力美学

物以类聚的Kmeans:数据分群的暴力美学 本文用三维可视化解析Kmeans聚类如何将混沌数据划出清晰边界,从算法原理、数学推导、评估指标到Python实战,揭示“无监督学习”的暴力美学与致命陷阱。 聚类算法 文章摘要 🔍 《Kmeans聚类…

正式页面开发-登录注册页面

整体路由设计: 登录和注册的切换是切换组件或者是切换内容(v-if和 v-else),因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页,有三个大模块:文章分类&…

fopen的打开方式

fopen的打开方式 FILE *fopen(const char *filename, const char *mode); filename表示文件名字, mode表示打开的文件方式

Docker 常用指令手册(学习使用)

CentOS Docker 实用指令手册 1. 安装与配置 # CentOS 安装Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl st…

PostgreSQL中的外键与主键

在 PostgreSQL 中,外键(Foreign Key) 是一种用于建立表间关联的数据库约束机制,其核心作用与主键(Primary Key)有显著区别。以下是详细解析: 一、外键的定义与作用 定义 外键是表中的一个或多个…

NFC拉起微信小程序申请URL scheme 汇总

NFC拉起微信小程序,需要在微信小程序开发里边申请 URL scheme ,审核通过后才可以使用NFC标签碰一碰拉起微信小程序 有不少人被难住了,从微信小程序开发社区汇总了以下信息,供大家参考 第一,NFC标签打开小程序 https://…

如何使用clip模型进行OOD

使用CLIP模型进行OOD检测(Out-of-Distribution Detection) 的核心思路是:利用CLIP的多模态对齐能力(图像和文本的联合嵌入空间),通过计算输入样本与已知类别语义的匹配度,判断其是否属于已知分布。 CLIP的…

Word 插入图片会到文字底下解决方案

一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…

1. HTTP 数据请求

相关资源: 图片素材📎图片素材.zip 接口文档 1. HTTP 数据请求 什么是HTTP数据请求: (鸿蒙)应用软件可以通过(鸿蒙)系统内置的 http 模块 和 Axios,通过 HTTP 协议和服务器进行通讯 学习核心Http请求技术: Http模块 - 属于鸿…