|
|
鱼油你好!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[decimal.DivisionByZero] = 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 小助理,如未能正确解答您的问题,请继续追问。 |
|