django v3.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 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.099999999999999980,但之前版本中的相同代码生成预期结果 0.01。通过检查为更新查询生成MysqL 查询,我发现在新版本号中使用了引用发送,但在以前的版本中没有引用。即在新版本中,我们有类似 UPDATE `api_foo` SET `amount` = (`api_foo`.`amount` - '0.4') WHERE `api_foo`.`id` = 1内容,但在前一个版本中,我们有 UPDATE `api_foo` SET `amount` = (`api_foo`.`amount` - 0.4) WHERE `api_foo`.`id` = 1。另外我必须提到,这仅发生在 MysqL 驱动程序中,而不是在 sqllite 中。

我知道这看起来像是一个错误,但我猜我遗漏了一些微不足道的东西。

我使用的是 mysql-8.0.19,并且在 django 的 3.2 和 3.2.3 版本中得到了相同的值。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)