Python实现Decimal去除末尾零、禁用科学计数法且不四舍五入
实现方案
原有方案精度丢失的根源是将Decimal类型强转为float类型,双精度浮点数仅能保留15-17位有效十进制数字,转换阶段就已经发生了四舍五入和精度丢失,后续格式化无法恢复精度。
以下实现完全满足需求:
from decimal import Decimal def format_decimal_strict(value: Decimal) -> Decimal: """ 功能对标np.format_float_positional: 1. 自动移除末尾无效零 2. 不做任何四舍五入 3. 禁止输出科学计数法 4. 入参、出参均为Decimal类型 """ # 移除末尾无效零 normalized_val = value.normalize() # 强制使用定点格式转字符串,彻底避免科学计数法,无任何舍入操作 fixed_point_str = f"{normalized_val:f}" # 转回Decimal保证类型一致 return Decimal(fixed_point_str)
方案验证
- 测试输入:
Decimal("0.55555555555555555550") - 函数输出:
Decimal("0.5555555555555555555"),完全符合预期 - 对应测试代码:
if __name__ == "__main__": test_input = Decimal("0.55555555555555555550") output = format_decimal_strict(test_input) print(output) # 0.5555555555555555555 print(type(output)) # <class 'decimal.Decimal'> print(output == Decimal("0.5555555555555555555")) # True
业务场景替换
直接替换原有numpy实现即可,不需要额外依赖:
# 原实现(存在精度丢失) # import numpy as np # formated = np.format_float_positional((float(instance.factor)), trim="-") # 新实现 formated = format_decimal_strict(instance.factor)
注:该实现完全适配当前序列化器
max_digits=40, decimal_places=20的参数范围,不会出现科学计数法问题。
内容的提问来源于stack exchange,提问作者user3565923
相关产品推荐
相关产品推荐

