我的表单包含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()
当我来访问DecimalField
,price
的值时,我得到它没有尾随零。假设在表单字段中输入的值为50:
print(my_model.price)
# Prints 50
但是当我从头开始获取模型,然后检索价格时,我会得到尾随的零。
my_model = MyModel.objects.get(id=my_model.id)
print(my_model.price)
# Prints 50.00
我只是想知道为什么会这样。
答案 0 :(得分:1)
浮点问题之一是它们通常无法表示很多十进制值。例如,0.3
无法准确表示。
另一方面,Python有一种名为Decimal
的类型,它不适用于IEEE-754浮点规范。但是将其格式化为十进制数字流。因此,它可以正确表示十进制数字,并正确执行计算(但是很难以紧凑的方式存储数字)。
由于数据库通常也使用这种表示,因此Django使用Decimal
来防止在读取或写入数据库时丢失数据。此Decimal
包含精度,并以50
精度打印50.00
等数字(int
)。
float
s,int
s等。在这种情况下,当您将这些值写入数据库时,这些值将转换为十进制表示。
因此,如果您将int
分配给模型实例的属性,那么该属性将具有类型Decimal
(这基本上就是您为Python对象分配属性的方式)。如果然后将它存储在数据库中,Django会将其序列化为十进制,并以这种方式存储在数据库中。如果稍后获取模型,则在内存中有一个模型,其属性为execution
,用于存储具有指定精度的数字。