首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >姜戈:货币是FloatField还是DecimalField?

姜戈:货币是FloatField还是DecimalField?
EN

Stack Overflow用户
提问于 2010-04-03 04:28:57
回答 4查看 51.4K关注 0票数 88

我很好奇哪一个更适合作为货币域?我会做一些简单的操作,比如取差值,新旧价格之间的百分比。我计划在零(即10.50)之后保留两位数,如果这些数字大部分时间是零,我将隐藏这些数字并将其显示为"10“

ps:货币不是以美元为基础的:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-03 04:34:10

总是使用DecimalField来赚钱。即使是简单的运算(加法、减法)也不能幸免于浮点舍入问题:

代码语言:javascript
运行
复制
>>> 10.50 - 0.20
10.300000000000001

>>> Decimal('10.50') - Decimal('0.20')
Decimal('10.30')
票数 146
EN

Stack Overflow用户

发布于 2014-12-13 00:44:40

这个问题的答案是正确的,但是一些用户会偶然发现这个问题,以找出DecimalFieldFloatField之间的区别。Seth提出的浮点舍入问题是一个货币问题。

Django文档状态

FloatField类有时会与DecimalField类混淆。虽然它们都表示实数,但它们表示这些数字的方式不同。FloatField在内部使用Python的float类型,而DecimalField使用Python的Decimal类型。

阅读更多here

以下是两个字段之间的其他区别:

DecimalField:

  • DecimalFields必须定义一个步骤和一个步骤attribute.
  • You从上面的必需属性中获得两个自由形式的验证,例如,如果你将decimal_places设置为4,并且你输入了一个4.00000 (5位)的小数,你将会得到这样的错误:确保总共不超过4位。
  • 你也会得到一个类似的小数位的表单验证(在大多数浏览器中也会使用输入字段中的步骤属性在前端进行验证。如果将类型和类型设置为值,您将得到一个错误,即最小值必须为0.1.
  • Returns a type,0.001 is decimal.Decimal‘t0.1.
  • Returns of DecimalField
  • With a Decimal type,由于需要如上所述地设置所需的属性,系统还会为您处理舍入。因此,在shell中,如果您在数据库(postgresql)中执行
  • ,则会将DecimalField保存为主类型,并将存储设置为“numeric(max_digits, decimal_places)”,从上面的示例中,类型为postgresql

更多关于DecimalField from the Django Docs的信息。

FloatField:

<type 'float'>

  • No会返回内置的浮点型<type 'float'>

  • No智能舍入,实际上可能会导致舍入问题,如set中所述。

  • 没有从postgresql数据库(postgresql)获得的额外表单验证,FloatField将另存为“双精度”类型,并且存储被设置为“普通”

更多关于FloatField from the Django Docs的信息。

适用于以下两种情况:

  • 这两个字段都是从Field类扩展而来的,可以接受blanknullverbose_namenameprimary_keymax_length、D66、D67、D68、D69、D70、D71、D72、D73、D74、D75、D76、D77、D78、D79、D80、D81属性、与从Field扩展的所有字段一样,这两个字段的默认表单小部件都是TextInput.

我在寻找这两个字段之间的差异时遇到了这个问题,所以我认为这会对那些处于相同情况的人有所帮助:)

更新:为了回答这个问题,我认为你可以使用这两种语言中的任何一种来表示货币,尽管Decimal更适合。当计数为浮点数时,存在舍入问题,因此您必须使用round(value, 2),以便将float表示四舍五入到小数点后两位。下面是一个快速示例:

代码语言:javascript
运行
复制
>>> round(1.13 * 50 + .01, 2)
56.51

你仍然会在使用floatround时遇到麻烦。就像这里,我们看到它向下取整的值是5

代码语言:javascript
运行
复制
>>> round(5.685, 2)
5.68

但在本例中,它将四舍五入:

代码语言:javascript
运行
复制
>>> round(2.995, 2)
3.0

它与浮点数在内存中的存储方式有关。参见here

票数 69
EN

Stack Overflow用户

发布于 2018-05-17 01:28:34

我知道这太老了,但我偶然发现它是为了寻找完全不同的东西,我想指出,一般来说,使用浮点数(浮点或小数)作为货币是不可取的,因为浮点数学四舍五入总是会导致计算中的小误差,随着时间的推移,可能会增加非常大的误差。

相反,可以根据自己的喜好使用整型字段或字符串。将货币相乘以将小数位移到末尾,并在存储时生成一个整数,然后在需要显示小数位时将小数位移回原来的位置。这基本上是银行(和大多数货币库)处理存储数据的方式,并将在以后为您省去大量的麻烦。

我很艰难地学会了这一点,因为这并不是一个常见的话题;也许这可以让其他人避免做同样的事情。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2569015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档