微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

django v3.2 中十进制字段的问题

如何解决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 举报,一经查实,本站将立刻删除。