Django DecimalField省略尾随零

时间:2018-06-04 10:12:14

标签: django forms decimal

我的表单包含DecimalField,其属性为max_digits=8, decimal_places=2, validators=[MinValueValidator(0)], blank=True, null=True

在我看来,我收到了表格返回的模型:

my_model = form.save(False)

# Do stuff with returned model
...

my_model.save()

当我来访问DecimalFieldprice的值时,我得到它没有尾随零。假设在表单字段中输入的值为50:

print(my_model.price)
# Prints 50

但是当我从头开始获取模型,然后检索价格时,我会得到尾随的零。

my_model = MyModel.objects.get(id=my_model.id)
print(my_model.price)
# Prints 50.00

我只是想知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

浮点问题之一是它们通常无法表示很多十进制值。例如,0.3无法准确表示。

另一方面,Python有一种名为Decimal的类型,它不适用于IEEE-754浮点规范。但是将其格式化为十进制数字流。因此,它可以正确表示十进制数字,并正确执行计算(但是很难以紧凑的方式存储数字)。

由于数据库通常也使用这种表示,因此Django使用Decimal来防止在读取或写入数据库时​​丢失数据。此Decimal包含精度,并以50精度打印50.00等数字(int)。

然而,Django旨在接受所有类型的数值,包括float s,int s等。在这种情况下,当您将这些值写入数据库时​​,这些值将转换为十进制表示。

因此,如果您将int分配给模型实例的属性,那么该属性将具有类型Decimal(这基本上就是您为Python对象分配属性的方式)。如果然后将它存储在数据库中,Django会将其序列化为十进制,并以这种方式存储在数据库中。如果稍后获取模型,则在内存中有一个模型,其属性为execution,用于存储具有指定精度的数字。