django v3.2中的十进制字段存在问题
从3.1版升级到3.2版后,我发现使用十进制字段存在精度问题。下面的示例是一个可以重新生成问题的小代码django v3.2中的十进制字段存在问题,django,django-3.2,Django,Django 3.2,从3.1版升级到3.2版后,我发现使用十进制字段存在精度问题。下面的示例是一个可以重新生成问题的小代码 from django.db import models class Foo(models.Model): amount = models.DecimalField( null=False, decimal_places=18, max_digits=44) # A simple insertion example from ap
from django.db import models
class Foo(models.Model):
amount = models.DecimalField(
null=False,
decimal_places=18,
max_digits=44)
# A simple insertion example
from api.models import Foo
from django.db.models import F
from decimal import Decimal
f = Foo.objects.create(amount=Decimal('0.5'))
f.amount = F('amount') - Decimal('0.4')
f.save(update_fields=['amount', ])
f.refresh_from_db()
print(f.amount)
此代码生成0.09999999999980
,但以前版本中的相同代码生成预期结果0.01
。通过检查为更新查询生成的mysql查询,我发现在新版本中,number使用引号发送,但在以前的版本中并没有引号。i、 在新版本中,我们有类似这样的东西,UPDATE`api\u foo`SET`amount`=(`api\u foo`.`amount`-'0.4'),其中`api\u foo`.`id`=1
,但在上一个版本中,我们有UPDATE`api\u foo`SET`amount`=(`api\u foo`.`amount`-0.4),其中`api\u foo`.`id`=1
。我还必须提到,这只发生在mysql驱动程序中,而不是在sqllite中
我知道这看起来像一个bug,但我猜我遗漏了一些琐碎的东西
我使用的是mysql-8.0.19,在django的3.2和3.2.3版本中得到了相同的值。您是否尝试设置十进制精度?getcontext().prec=18I也尝试了这个,得到了相同的结果。请注意,它在以前的版本中生成正确的结果。