VIRUS_2091 发表于 3 天前

Decimal模块功能大全?

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

import decimal as ds
i = 0
while i <= 1:
    i += ds.Decimal('0.1')
    print(i)

FishC 发表于 3 天前

鱼油你好!Decimal模块除了算浮点数,还有很多强大功能,下面给你一一介绍。

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

from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2'))# 0.3


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

import decimal
decimal.getcontext().prec = 6
print(Decimal('1') / Decimal('3'))# 0.333333


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

with decimal.localcontext() as ctx:
    ctx.prec = 10
    result = Decimal('1') / Decimal('7')
print(result)


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

decimal.getcontext().rounding = decimal.ROUND_DOWN
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、-Infinity、NaN等。

print(Decimal('Infinity') > Decimal('999999'))
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() 取负


d = Decimal('4')
print(d.sqrt())   # 2
print(d.exp())    # 54.598...


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

d = Decimal('5')
print(d.is_finite())   # True
print(d.is_integer())# True
print(d.is_zero())   # False


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

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


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

d = Decimal('3.14159')
print(d.quantize(Decimal('0.00')))# 3.14
print(f"{d:.3f}")# 3.142


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

with decimal.localcontext() as ctx:
    ctx.traps = True
    try:
      Decimal('1') / Decimal('0')
    except decimal.DivisionByZero:
      print('除零错误!')


10. 其他常用方法

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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Decimal模块功能大全?