鱼C论坛

 找回密码
 立即注册
查看: 5|回复: 1

Decimal模块功能大全?

[复制链接]
发表于 前天 14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前只会用Decimal模块来计算浮点数这种极其easy的操作
求进阶

import decimal as ds
i = 0
while i <= 1:
    i += ds.Decimal('0.1')
    print(i)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 14:09 | 显示全部楼层
鱼油你好!Decimal模块除了算浮点数,还有很多强大功能,下面给你一一介绍。

1. 基础回顾
Decimal(str)可以精确表示十进制浮点数,避免二进制误差。

  1. from decimal import Decimal
  2. print(Decimal('0.1') + Decimal('0.2'))  # 0.3
复制代码


2. 精度控制(Context)
getcontext()获取当前上下文,修改prec可控制有效数字位数。

  1. import decimal
  2. decimal.getcontext().prec = 6
  3. print(Decimal('1') / Decimal('3'))  # 0.333333
复制代码


localcontext()可以临时改变精度而不影响全局。

  1. with decimal.localcontext() as ctx:
  2.     ctx.prec = 10
  3.     result = Decimal('1') / Decimal('7')
  4. print(result)
复制代码


3. 舍入模式
rounding属性控制舍入方式,例如:

  1. decimal.getcontext().rounding = decimal.ROUND_DOWN
  2. print(Decimal('2.345').quantize(Decimal('0.01')))  # 2.34
复制代码

常用模式有:
  • ROUND_DOWN 向零舍入
  • ROUND_UP 远离零舍入
  • ROUND_HALF_EVEN 银行家舍入(默认)
  • ROUND_HALF_UP 四舍五入
  • ROUND_CEILING 向正无穷
  • ROUND_FLOOR 向负无穷


4. 特殊值
Decimal支持Infinity-InfinityNaN等。

  1. print(Decimal('Infinity') > Decimal('999999'))
  2. print(Decimal('NaN').is_nan())
复制代码


5. 数学函数
Decimal提供丰富的数学方法:
  • .sqrt() 平方根
  • .exp() e的指数
  • .ln() 自然对数
  • .log10() 以10为底对数
  • .fma(other, third) 融合乘加(a*b+c)
  • .max/.min 取最大/最小
  • .copy_abs() 绝对值
  • .copy_negate() 取负


  1. d = Decimal('4')
  2. print(d.sqrt())   # 2
  3. print(d.exp())    # 54.598...
复制代码


6. 比较与判断
Decimal之间可以直接比较,还提供一些判断方法:

  1. d = Decimal('5')
  2. print(d.is_finite())   # True
  3. print(d.is_integer())  # True
  4. print(d.is_zero())     # False
复制代码


7. 转换与分解
as_tuple()可得到符号、数字、指数;也可从元组创建。

  1. d = Decimal('-12.34')
  2. print(d.as_tuple())  # DecimalTuple(sign=1, digits=(1,2,3,4), exponent=-2)
  3. print(Decimal((1, (1,2,3,4), -2)))  # -12.34
复制代码


8. 格式化输出
quantize()指定小数位数,或直接用format()

  1. d = Decimal('3.14159')
  2. print(d.quantize(Decimal('0.00')))  # 3.14
  3. print(f"{d:.3f}")  # 3.142
复制代码


9. 信号与陷阱
Decimal会抛出异常信号,例如DivisionByZeroInvalidOperation。可设置陷阱控制是否报错。

  1. with decimal.localcontext() as ctx:
  2.     ctx.traps[decimal.DivisionByZero] = True
  3.     try:
  4.         Decimal('1') / Decimal('0')
  5.     except decimal.DivisionByZero:
  6.         print('除零错误!')
复制代码


10. 其他常用方法
  • .adjusted() 返回指数调整值(表示位数)
  • .normalize() 去掉多余尾零
  • .scaleb(n) 乘以10的n次方
  • .same_quantum(other) 判断指数是否相同
  • .to_integral() 取整


总之,Decimal模块核心是:精确的十进制运算 + 可控的精度/舍入 + 丰富的数学功能。掌握这些,你就能从“只能算浮点数”进阶到熟练运用啦!如有具体问题,欢迎继续问~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-20 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表