Polars v1.6.0乘法精度异常:是否有更优的乘数精度设置方案?
Polars Decimal乘法精度问题优化解决方案
问题复现
在Polars v1.6.0中执行Decimal类型与10/71的乘法时,出现以下问题:
- 直接使用浮点数
10/71相乘,乘数精度会被被乘列的原始小数位数限制(如decimal[*,1]列仅用0.1计算),导致结果精度不足。 - 直接用
Decimal(10/71)作为乘数会触发BindingsError: "Decimal is too large to fit in Decimal128"报错。
复现代码
from decimal import Decimal import polars as pl df = pl.DataFrame({ "a": [2, 5], "b": [Decimal('2.0'), Decimal('5.0')], "c": [Decimal('2.00'), Decimal('5.00')], "d": [Decimal('2.000'), Decimal('5.000')], "e": [Decimal('2.0000'), Decimal('5.0000')] }) # Demo 1:精度被原始列限制 dfn = df.with_columns( pl.col(col).mul(10/71) for col in df.columns ) print(dfn) # Demo 2:手动量化乘数才能运算 dfn = df.with_columns( pl.col(col).mul(Decimal(10/71).quantize((Decimal('1.0000')))) for col in df.columns ) print(dfn)
优化解决方案
1. 用字符串构造精确Decimal乘数
避免从浮点数转换Decimal,直接通过字符串构造精确的乘数,既保证精度,又不会触发范围错误:
# 用十进制精确计算10/71 multiplier = Decimal('10') / Decimal('71') dfn = df.with_columns( pl.col(col).mul(multiplier) for col in df.columns ) print(dfn)
效果:乘数保持完整精度,Polars会遵循Decimal乘法规则自动处理结果小数位数,不会被原始列精度限制,同时避免了浮点数转Decimal的精度损失。
2. 统一结果精度(可选)
如果需要所有列输出相同精度,可在乘法后统一量化:
target_precision = Decimal('0.0000') dfn = df.with_columns( pl.col(col).mul(multiplier).quantize(target_precision) for col in df.columns ) print(dfn)
内容的提问来源于stack exchange,提问作者fishfin
相关产品推荐
相关产品推荐

