网易首页 > 网易号 > 正文 申请入驻

Python 库手册:decimal 十进制浮点运算模块

0
分享至

decimal 是 Python 提供的十进制浮点运算模块,可用于避免二进制浮点(如 float)带来的精度误差。

常见应用场景:

(1)金融与会计计算,货币金额对精度要求极高。

(2)精密科学计算,如天文、物理实验等。

(3)精度可控的用户输入和显示。

◆ ◆

核心概念

1、Decimal 类型

与内建的 float 类型不同,Decimal 使用十进制表达并记录每一位有效数字。

from decimal import Decimal

x = Decimal('0.1') + Decimal('0.2')
print(x)  # 输出:0.3(精确值)

而使用 float:

print(0.1 + 0.2)  # 输出:0.30000000000000004(误差)

2、上下文控制

decimal 模块允许用户通过“上下文”(Context)设置精度、舍入规则等。

from decimal import getcontext
getcontext().prec = 4  # 设置全局精度为 4 位有效数字

◆ ◆

应用举例

例 1:避免浮点误差(基本用途)

from decimal import Decimal

a = Decimal('1.00')
b = Decimal('0.80')
c = Decimal('0.20')

print(a - b == c)  # 输出 True,完全精确

例 2:控制精度与舍入方式

from decimal import Decimal, getcontext, ROUND_HALF_UP

getcontext().prec = 6
getcontext().rounding = ROUND_HALF_UP

price = Decimal('2.675')
rounded = price.quantize(Decimal('0.01'))  # 四舍五入到两位小数
print("Rounded:", rounded)  # 输出:2.68

例 3:不推荐的构造方式

from decimal import Decimal

x = Decimal(1.1)       # 含精度误差
y = Decimal('1.1')     # 推荐写法

print("错误方式:", x)
print("推荐方式:", y)

例 4:使用 localcontext() 设置局部精度

from decimal import Decimal, localcontext

x = Decimal('1.23456')

with localcontext() as ctx:
    ctx.prec = 3
    print("局部精度:", x / Decimal('7'))  # 只在 with 块内生效

print("全局精度:", x / Decimal('7'))      # 恢复原精度

例 5:使用 as_tuple() 获取结构信息

from decimal import Decimal

d = Decimal('123.45')
t = d.as_tuple()
print("符号位:", t.sign)         # 0 表示正数
print("数字位:", t.digits)       # (1, 2, 3, 4, 5)
print("指数位:", t.exponent)     # -2 表示小数点后两位

◆ ◆

常用函数速览

decimal.Context

表示一个计算上下文对象,用于控制精度、舍入方式、异常处理等。

参数

可通过 decimal.getcontext() 获取当前上下文;也可新建 Context(prec=28, rounding=...)

返回:Context 对象。常用于 context.add(a, b) 这类方法形式

decimal.Decimal(value)

将字符串、整数、浮点数等转换为高精度的 Decimal 对象。推荐使用字符串作为参数以避免隐式精度误差。

参数

value:可以是字符串(推荐)、整数或浮点数

返回:Decimal 类型对象

示例:

Decimal('0.1')  # 推荐
Decimal(0.1)    # 不推荐,存在隐含误差

decimal.getcontext()

获取当前线程使用的十进制计算上下文对象,可用于控制精度与舍入方式。

参数:无

返回:当前 Context 对象,可进一步设置属性如 .prec、.rounding 等

decimal.setcontext(context)

设置当前线程的十进制计算上下文。

参数

context:一个 Context 对象,通常通过 getcontext().copy() 创建副本再修改

返回:无

decimal.localcontext(ctx=None)

创建一个上下文管理器,在 with 语句块中临时替换全局上下文,退出时恢复。

参数

ctx:可选,指定上下文对象;若为空则使用当前默认上下文的副本

返回:上下文管理器,用于 with 语句

示例:

with decimal.localcontext() as ctx:
    ctx.prec = 4
    print(Decimal('1.23456') / Decimal('7'))  # 局部生效

Decimal.quantize(exp, rounding=None)

将当前 Decimal 数值四舍五入到指定的小数精度。

参数

exp:一个 Decimal,表示目标精度,如 Decimal('0.01') 表示保留两位小数

rounding:舍入方式,如 ROUND_HALF_UP,可选,若不提供则使用上下文默认

返回:处理后新的 Decimal 对象(不会改变原值)

示例:

Decimal('2.675').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)  # -> Decimal('2.68')

Decimal.copy_abs()

返回当前 Decimal 的绝对值副本。

参数:无

返回:Decimal 类型,去掉符号但保留原数值

Decimal.copy_negate()

返回当前 Decimal 的符号取反副本。

参数:无

返回:Decimal 类型,符号与原值相反

Decimal.as_tuple()

将 Decimal 对象转换为包含符号、数字、指数的三元组。

参数:无

返回

DecimalTuple(sign, digits, exponent)

例如:Decimal('3.14').as_tuple() → DecimalTuple(sign=0, digits=(3, 1, 4), exponent=-2)

Decimal.to_eng_string()

将 Decimal 对象转换为“工程计数法”字符串形式(指数为 3 的倍数)。

参数:无

返回:字符串,例如 Decimal('1230000').to_eng_string() → '1.23E+6'

◆ ◆

补充说明

1、若对结果精度要求严格(如货币、计量),必须使用 Decimal 替代 float。

2、使用字符串创建 Decimal,比如,Decimal('0.1'),而不要用 Decimal(0.1)。

3、控制输出精度与舍入行为时,请使用 quantize(),不要依赖格式化字符串。

4、decimal 运算速度略慢于 float,如非高精度任务可用 float。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
金价将重现历史?要有心理准备,8月,金价可能将复刻2015年历史

金价将重现历史?要有心理准备,8月,金价可能将复刻2015年历史

阿振观点
2026-08-20 06:00:58
人在家中坐,祸从天上来,52岁董卿再迎噩耗,终是步上刘晓庆老路

人在家中坐,祸从天上来,52岁董卿再迎噩耗,终是步上刘晓庆老路

枫尘余往逝
2026-08-18 07:50:26
三浦知良点球破门,刷新天皇杯最年长进球纪录

三浦知良点球破门,刷新天皇杯最年长进球纪录

懂球帝
2026-08-19 20:51:03
阿尔瓦雷斯转会风波,瓜迪奥拉:马竞不该凌驾球员诉求,是不成熟的选择

阿尔瓦雷斯转会风波,瓜迪奥拉:马竞不该凌驾球员诉求,是不成熟的选择

体育闲话说
2026-08-20 06:33:11
媒体人:辽宁铁人外援瓦吉奇已于今日离开沈阳

媒体人:辽宁铁人外援瓦吉奇已于今日离开沈阳

懂球帝
2026-08-20 18:13:12
赶在日本夺岛前,中俄达成共识,必要时会动用王牌,32国开始选边

赶在日本夺岛前,中俄达成共识,必要时会动用王牌,32国开始选边

孤酒老巷QA
2026-08-20 20:19:40
48年粟裕拒不过江,上级打算换掉他,陈毅严肃道:换他前先换我!

48年粟裕拒不过江,上级打算换掉他,陈毅严肃道:换他前先换我!

浩渺青史
2026-08-20 14:17:53
“内娱四帅”排名出炉:王一博落榜,张凌赫没进前三、第一太意外

“内娱四帅”排名出炉:王一博落榜,张凌赫没进前三、第一太意外

娱说瑜悦
2026-08-20 15:20:38
甘伯杯:7000万欧新援失点,18岁妖星弑旧主,巴萨2-1开罗国民夺冠

甘伯杯:7000万欧新援失点,18岁妖星弑旧主,巴萨2-1开罗国民夺冠

钉钉陌上花开
2026-08-20 05:11:43
长宁升学宴最新进展!村支书回应:村里有规定,10桌以上要报备

长宁升学宴最新进展!村支书回应:村里有规定,10桌以上要报备

天天热点见闻
2026-08-20 10:15:21
宇树敲钟上市,王兴兴全程“冷脸”

宇树敲钟上市,王兴兴全程“冷脸”

观澜人物
2026-08-20 10:18:11
铜价大涨39%,洛阳钼业半年赚161亿元股价却较年内高点跌三成,中期拟分红超20亿

铜价大涨39%,洛阳钼业半年赚161亿元股价却较年内高点跌三成,中期拟分红超20亿

时代财经
2026-08-20 15:58:16
制造“张志超冤案”的山东检察官,受到了法律的全方位呵护

制造“张志超冤案”的山东检察官,受到了法律的全方位呵护

塔子山评说
2026-08-20 14:42:41
本硕博全撤!北京户口注销,国企工作丢了,哥哥:被弟弟毁了一生

本硕博全撤!北京户口注销,国企工作丢了,哥哥:被弟弟毁了一生

新一说史
2026-08-19 06:26:55
彻底杀疯!伊朗突破百年战争底线,追杀特朗普全家,美国彻底没辙

彻底杀疯!伊朗突破百年战争底线,追杀特朗普全家,美国彻底没辙

二大爷观世界
2026-07-31 05:40:55
往后三年,央国企可能要大批内退了

往后三年,央国企可能要大批内退了

阿振观点
2026-08-20 05:55:13
鸟巢要拆?一年烧掉8000万,一天20多万,这座"吞金兽"留着干啥

鸟巢要拆?一年烧掉8000万,一天20多万,这座"吞金兽"留着干啥

流史岁月
2026-08-20 14:35:06
王励勤或没想到, 大迪击败日本队仅 2 天, 却意外暴露马琳的真正实力

王励勤或没想到, 大迪击败日本队仅 2 天, 却意外暴露马琳的真正实力

张发林
2026-08-20 18:28:20
2026年失业潮没结束,破产潮又来了!

2026年失业潮没结束,破产潮又来了!

东亚财评V
2026-08-20 19:17:19
CCTV5直播,中国男篮VS卡塔尔,廖三宁交出球权,郭士强重用2人!

CCTV5直播,中国男篮VS卡塔尔,廖三宁交出球权,郭士强重用2人!

体坛小快灵
2026-08-20 09:04:44
2026-08-20 21:03:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2076文章数 86关注度
往期回顾 全部

科技要闻

快手Q2研发狂烧45亿:如何面对双面夹击

头条要闻

“绝对的‘女汉子’”任上落马 丈夫也被带走调查

头条要闻

“绝对的‘女汉子’”任上落马 丈夫也被带走调查

体育要闻

拥有“儿皇梦”的罗德里,为何选择巴萨?

娱乐要闻

任重晒全家福官宣二胎喜讯

财经要闻

许家印被判处无期 恒大集团被罚88.2亿

汽车要闻

智能硬派越野方盒子 享界G9上市售42.98万起

态度原创

本地
亲子
手机
旅游
公开课

本地新闻

先导片|攀登不止,让不同的故事在此连接

亲子要闻

这支短片,定格了儿子自两岁到七岁的童真笑颜

手机要闻

索尼Xperia 10 VIII现身Geekbench,搭载高通骁龙6 Gen 3处理器

旅游要闻

强制购物、无证带团……重庆文旅公布6起旅游市场行政处罚典型案例

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版