Django:FloatField或DecimalField的货币?
我很好奇哪一个更适合作为货币领域? 我会做一些简单的操作,如差价,新旧价格的比例。 我打算保留零(即10.50)两个数字,大部分时间,如果这些数字是零,我会隐藏这些数字,并显示为“10”
PS:货币不是美元的基础:)
总是使用DecimalField
来获得金钱。 即使简单的操作(加法,减法)也不能解决浮点四舍五入问题:
>>> 10.50 - 0.20 10.300000000000001 >>> Decimal('10.50') - Decimal('0.20') Decimal('10.30')
问题的答案是正确的,但是有些用户会偶然发现这个问题,以找出DecimalField和FloatField之间的区别。 塞思提出的浮动四舍五入问题是货币问题。
Django文档状态
FloatField类有时与DecimalField类混合在一起。 尽pipe它们都代表实数,但它们代表的数字不同。 FloatField在内部使用Python的floattypes,而DecimalField使用Python的Decimaltypes。 在这里阅读更多。
以下是两个领域之间的其他差异:
DecimalField:
- DecimalFields必须定义“decimal_places”和“max_digits”属性。
- 您可以从上述必需的属性中获得两个自由格式validation,即如果将max_digits设置为4,并且键入的小数点为4.00000(5位数),则会出现此错误:确保不超过4数字总数。
- 你也得到了一个类似的表单validation小数位(在大多数浏览器也将使用input字段上的步骤属性在前端validation。如果您设置decimal_places = 1并input0.001作为值,您将得到一个错误最小值必须是0.1。
- 返回一个decimal.Decimal,types是
- DecimalField没有额外的validation
- 对于十进制types,由于需要如上所述设置所需的属性,因此也会处理舍入。 所以从壳,如果你
- 在数据库(postgresql)中,DecimalField被保存为一个数字(max_digits,decimal_laces)types,而Storage被设置为“main”,从上面的例子中Type是numeric(4,1)
更多关于Django Docs的DecimalField 。
FloatField:
- 返回内置的浮点types,
- 没有聪明的四舍五入,并且实际上可能会导致Seths回答中所述的四舍五入问题。
- 没有从DecimalField获得的额外表单validation
- 在数据库(postgresql)中,FloatField被保存为“双精度”types,存储设置为“普通”
更多关于Django Docs的FloatField
适用于两者:
- 这两个字段从“字段”类扩展,可以接受“空白”,“空”,“verbose_name”,“名称”,“primary_key”,“max_length”,“唯一”,“db_index”,“rel”,“默认','可编辑','序列化','unique_for_date','unique_for_month','unique_for_year','select','help_text','db_column','db_tablespace','auto_created','validators','error_messages'属性,因为从“字段”延伸的所有字段将具有。
- 这两个字段的默认表单控件是一个TextInput。
当我find这两个领域之间的差异时,我碰到这个问题,所以我认为这将有助于那些在相同的情况:)
更新:为了回答这个问题,我认为你可以摆脱货币表示,尽pipe十进制是一个更好的select。 有一个四舍五入的问题,当它计数浮动的,所以你必须使用round(value, 2)
,以保持你的浮点数表示四舍五入到小数点后两位。 这里是一个简单的例子:
>>> round(1.13 * 50 + .01, 2) 56.51
你仍然可以遇到麻烦和浮动。 就像在这里,我们看到它的值为5:
>>> round(5.685, 2) 5.68
但在这种情况下,它将会圆满:
>>> round(2.995, 2) 3.0
这一切都与如何浮动存储在内存中。 看到这里 。
编辑:Satchmo项目不再有效,所以看看这些替代品处理货币
- Django钱
- 奥斯卡
基于Django的Satchmo项目有一个值得关注的CurrencyField和CurrencyWidget。
查看源代码的satchmo_utils应用程序目录