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应用程序目录