Python decimal.decimal()函数正在生成未舍入的结果

Python decimal.decimal()函数正在生成未舍入的结果,python,python-3.x,floating-point,decimal,number-formatting,Python,Python 3.x,Floating Point,Decimal,Number Formatting,我是Python新手,在Python的Decimal模块中使用Decimal函数时遇到了问题。我理解,由于Python在内存中存储浮点值的方式,为了对它们执行计算以生成人类可读的结果,我们可以对结果使用round函数,也可以使用decimal.decimal()函数 在下面的代码中,我创建了一个类calc1,它只返回两个数字的加法和差。然而,每当我运行它时,即使我在代码中包含了decimal.decimal(),结果仍然是不舍入的 代码: 输出: 0.0 0.0 8.6 -2.6 17.2 -5

我是Python新手,在Python的Decimal模块中使用Decimal函数时遇到了问题。我理解,由于Python在内存中存储浮点值的方式,为了对它们执行计算以生成人类可读的结果,我们可以对结果使用round函数,也可以使用decimal.decimal()函数

在下面的代码中,我创建了一个类calc1,它只返回两个数字的加法和差。然而,每当我运行它时,即使我在代码中包含了decimal.decimal(),结果仍然是不舍入的

代码:

输出:

0.0 0.0
8.6 -2.6
17.2 -5.2
25.8 -7.8
34.4 -10.4
0.0 0
8.6 -2.5999999999999996447286321199499070644378662109375 17.2 -5.199999999999999289457264239899814128875732421875 25.799999999999997 -7.7999999999999971578290569595992565155029296875
34.4-10.39999999999999857891452847979962825775146484375

您的问题是,您正在将一个已经具有浮点精度的值传递给类,然后是
十进制类

您只需将希望分配给它的数字的字符串表示形式交给
Decimal
,就可以避免这种情况

from decimal import Decimal

class Calc1:
    def __init__(self, val_1, val_2):
        # these are now Decimal objects
        self.val_1 = val_1
        self.val_2 = val_2
    
    def add(self):
        # the Decimal conversion can be removed here
        # since both numbers are already Decimals
        return self.val_1 + self.val_2

    def sub(self):
        return self.val_1 - self.val_2
   
    def __str__(self):
        return str(self.add()) + " " + str(self.sub())

lst = []
for i in range(5):
    i_as_dec = Decimal(i)
    # Here we multiply a decimal representation of each of our numbers
    # this will hand a Decimal object to the Calc1 class
    lst.append(Calc1(Decimal('3') * i_as_dec, Decimal('5.6') * i_as_dec))
    print(lst[i])
输出:

0.0 0.0
8.6 -2.6
17.2 -5.2
25.8 -7.8
34.4 -10.4
然而,每当我运行它时,即使我在代码中包含了decimal.decimal(),结果仍然是不舍入的

这与
decimal一致。decimal
应根据以下内容执行:

类decimal.decimal(value=“0”,context=None)构造一个新的十进制 基于对象的值。(…)如果值是浮点,则二进制 浮点值以无损方式转换为精确的小数 相等的这种转换通常需要53位或更多的数字 精确例如,十进制(float('1.1')转换为 十进制('1.1000000000000088817841970012523233890533447265625')

作为旁注
decimal。decimal
是类,而不是函数

要生成人类可读的结果,可以对结果使用round函数,也可以使用decimal.decimal()函数

除此之外,您可能会决定格式化输出,例如使用所谓的,例如,如果我想在小数点后有4位数字:

x = 0.1 + 0.1 + 0.1
print(x)  # 0.30000000000000004
print(f'{x:.4f}')  # 0.3000

记住F-字符串只能在Python 3.6中使用,并且更新,如果必须使用旧版本,请考虑使用其他格式化方法。< /P>是否有任何方法将浮点变量转换为十进制?我试图将一个转换成字符串的浮点数传递给Decimal(),但它似乎仍然只有一半的时间有效。我刚刚在我的原始代码中编辑了两行代码:self.value1=dec.Decimal(str(value1))self.value2=dec.Decimal(str(value2)),它的工作方式与我在回答中提到的不一样,如果您将任何值作为浮点值传递,它已经具有浮点精度。例如,解释器中的

5.6*3
返回
16.79999999997
。在转换为字符串之前,将该值传递给
str()
不会以任何有意义的方式改变它。您可以选择应用某种类型的舍入,或者从源代码处使用
Decimal
s开始,我的答案是这样的。有没有办法根据变量本身将浮点值转换为十进制值,而不是使用f字符串或其他格式化工具来仅仅更改打印的输出?
5.6
是在到达
十进制
模块之前的本机浮点值,和
5.6*i
执行本机浮点运算,而不使用
decimal
模块。我不太使用Python,也不使用
decimal
模块,但我希望您希望从
“5.6”
作为字符串开始,将其转换为
decimal
值,然后从那里继续算术,完全避免本机Python浮点。