gpt4 book ai didi

python - 为什么 Django decimal max_digits 验证失败并出现奇怪的行为?

转载 作者:行者123 更新时间:2023-11-28 21:39:25 25 4
gpt4 key购买 nike

我有一个模型字段full_time_equivalent:

full_time_equivalent = models.DecimalField(
max_digits=5,
decimal_places=2,
default=100,
validators=[
MinValueValidator(Decimal(0)),
MaxValueValidator(Decimal(100))
]
)

为了确保验证器触发,我用以下方法覆盖了 save:

def save(self, *args, **kwargs):
# Run validations
self.full_clean()
return super().save(*args, **kwargs)

通过以下测试:

    project2_membership = ProjectMembership(
user=self.new_user,
project=project2,
is_project_manager=False,
full_time_equivalent=10.01
)

当我进入验证时,显示以下值和相应的错误:

Decimal('10.0099999999999997868371792719699442386627197265625')


django.core.exceptions.ValidationError:
{'full_time_equivalent': ['Ensure that there are no more than 5 digits in total.']

我做错了什么?

最佳答案

十进制值 10.01 不能精确地表示为 float 。当该值转换为小数时,您最终得到 Decimal('10.0099999999999997868371792719699442386627197265625'),它非常接近于 Decimal('10.01'),但您的max_digits 验证。

您可以通过在测试中使用字符串 '10.01' 或十进制 Decimal('10.01') 来防止错误。

from decimal import Decimal

project2_membership = ProjectMembership(
user=self.new_user,
project=project2,
is_project_manager=False,
full_time_equivalent=Decimal('10.01')
)

关于python - 为什么 Django decimal max_digits 验证失败并出现奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46832115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com