Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django v3.2中的十进制字段存在问题_Django_Django 3.2 - Fatal编程技术网

django v3.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

从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 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也尝试了这个,得到了相同的结果。请注意,它在以前的版本中生成正确的结果。