You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars v1.6.0乘法精度异常:是否有更优的乘数精度设置方案?

Polars Decimal乘法精度问题优化解决方案

问题复现

在Polars v1.6.0中执行Decimal类型与10/71的乘法时,出现以下问题:

  1. 直接使用浮点数10/71相乘,乘数精度会被被乘列的原始小数位数限制(如decimal[*,1]列仅用0.1计算),导致结果精度不足。
  2. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:38:20