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

Python中decimal.Decimal()函数返回未舍入结果问题求助

解决Decimal模块使用后仍出现浮点数精度问题的方案

嘿,我明白你遇到的困扰了——明明用上了decimal.Decimal()来处理运算,结果还是出现了那些烦人的长串不精确小数,对吧?让我来帮你拆解问题出在哪,以及怎么修复。

问题根源

你现在的代码是先对浮点数进行加减运算,得到一个已经存在精度损失的结果后,再把它转成Decimal。举个例子:

  • 当你计算5.6 * i的时候,5.6本身就无法用二进制浮点数精确存储(这是浮点数的固有特性),所以这个结果从一开始就带着误差。
  • 之后你把这个有误差的浮点数传给dec.Decimal(),它只能把这个不精确的数值原样保留,没法“修复”已经存在的精度问题。

解决方案:先转Decimal,再做运算

正确的做法是先把所有输入值转换成Decimal类型,再进行加减操作,这样整个运算过程都在Decimal的精确计算环境下进行,就能避免浮点数的精度损失。

修改后的代码

import decimal as dec

class calc1:
    'calc1 class is used for addition, subtraction only'
    obj_count = 0
    def __init__(self, value1, value2):
        # 初始化时就把输入转成Decimal
        self.value1 = dec.Decimal(value1)
        self.value2 = dec.Decimal(value2)
        calc1.obj_count += 1
    def add(self):
        # 直接对Decimal对象做加法
        return self.value1 + self.value2
    def sub(self):
        # 直接对Decimal对象做减法
        return self.value1 - self.value2
    def __str__(self):
        return f"{self.add()} {self.sub()}"

obj_list = []
for i in range(5):
    # 追求绝对精确的话,建议把浮点数转成字符串传入Decimal
    obj_list.append(calc1(3 * i, str(5.6 * i)))
    print(obj_list[i])

运行结果

修改后你会得到干净、精确的输出:

0 0
8.6 -2.6
17.2 -5.2
25.8 -7.8
34.4 -10.4

额外小贴士

如果你的输入是类似5.6这种十进制小数,最好以字符串形式传给Decimal(比如dec.Decimal("5.6")),因为字符串能精确表示十进制数,而浮点数5.6本身是二进制近似值,转成Decimal时会保留这个近似。

内容的提问来源于stack exchange,提问作者Anmol Saksena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:17:40