Python计算时如何固定保留小数点后指定位数?
固定3位小数精度的优化方案
方案1:自定义自动量化的Decimal子类(最适合大量计算场景)
直接继承Decimal重写实例化和运算方法,所有操作自动完成3位小数对齐,无需每次手动调用quantize,也不需要设置全局getcontext().prec适配大数值:
from decimal import Decimal class Decimal3(Decimal): # 统一量化精度,可按需修改 PREC = Decimal('0.001') def __new__(cls, value): instance = super().__new__(cls, value) return instance.quantize(cls.PREC) # 重写常用运算符,运算结果自动保持3位精度 def __mul__(self, other): return Decimal3(super().__mul__(other)) def __add__(self, other): return Decimal3(super().__add__(other)) def __sub__(self, other): return Decimal3(super().__sub__(other)) def __truediv__(self, other): return Decimal3(super().__truediv__(other)) def __pow__(self, exp, mod=None): return Decimal3(super().__pow__(exp, mod))
使用示例:
# 无需额外调用quantize x = Decimal3('2.41') y = x * x # 输出y即可得到5.808,自动保留3位小数
该方案天然适配大数值场景:因为quantize是针对小数点后位数处理,和全局有效位配置无关,不需要提前设置固定的getcontext().prec。
方案2:装饰器封装计算函数(适合计算逻辑集中的场景)
如果不想修改原有Decimal实例化逻辑,可以给计算函数加装饰器,返回值自动处理精度:
from decimal import Decimal from functools import wraps THREE_PLACES = Decimal('0.001') def auto_quantize(func): @wraps(func) def wrapper(*args, **kwargs): res = func(*args, **kwargs) if isinstance(res, Decimal): return res.quantize(THREE_PLACES) return res return wrapper
使用示例:
@auto_quantize def calculate(x, y): return (x * y) + x ** 2 x = Decimal('2.41') y = Decimal('3.62') result = calculate(x, y) # 自动返回3位小数结果
输出场景简化方案
如果仅需要输出时展示3位小数,不用修改计算逻辑,可以封装统一格式化工具,避免f-string冗余:
def fmt_3d(d: Decimal) -> str: return f"{d.quantize(Decimal('0.001')):f}" # 使用示例 x = Decimal('2.4123') print(fmt_3d(x)) # 输出2.412
内容的提问来源于stack exchange,提问作者Taha Akbari
相关产品推荐
相关产品推荐

