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
相关产品推荐
相关产品推荐

