django十进制表单字段的值不等于max_value

vai*_*ain 3 django django-forms

我的表单中有一个 DecimalField,我想限制min_value=0.1max_value=99.99

purity_percent = forms.DecimalField(max_value=99.99, min_value=0.1, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试输入等于0.199.99我将无法工作的值时,我会收到这些错误

For 0.1 : Ensure this value is greater than or equal to 0.1.

For 99.99 : Ensure this value is less than or equal to 99.99.

我该如何将这些也包含在限制中?

Rem*_*ich 5

浮点数,如99.99,以二进制形式存储。许多可以用有限十进制数字表示的数字都是二进制的重复分数(请参阅许多其他问题)。

特别是,字面意思99.99更接近于:

>>> "{:.15f}".format(99.99)
'99.989999999999995'
Run Code Online (Sandbox Code Playgroud)

Python 也有小数:

>>> from decimal import Decimal
>>> d = Decimal("99.99")
Run Code Online (Sandbox Code Playgroud)

果然,Decimal 99.99 大于 float max_value 99.99:

>>> d <= 99.99
False
Run Code Online (Sandbox Code Playgroud)

Django 开发人员了解二进制,这就是 Django 存在的全部原因DecimalField:它存储小数。

结论:用作Decimal("99.99")max_value,而不是浮点数。