我很好奇,哪种货币更适合作为货币领域?我将执行一些简单的操作,例如计算差异,新旧价格之间的百分比。我计划在零(即10.50)之后保留两位数字,并且大多数情况下如果这些数字为零,我将隐藏这些数字并将其显示为“ 10”
ps:货币不是基于美元的:)
Answers:
总是用DecimalField
钱。即使是简单的运算(加法,减法)也无法避免浮点舍入问题:
>>> 10.50 - 0.20
10.300000000000001
>>> Decimal('10.50') - Decimal('0.20')
Decimal('10.30')
这个问题的答案是正确的,但是一些用户会迷惑于这个问题,以找出DecimalField和FloatField之间的区别。塞思提出的浮点取整问题是货币问题。
Django文档状态
FloatField类有时与DecimalField类混合在一起。尽管它们均表示实数,但它们以不同的方式表示这些数字。FloatField内部使用Python的float类型,而DecimalField使用Python的Decimal类型。在这里阅读更多。
以下是这两个字段之间的其他区别:
DecimalField:
<class 'decimal.Decimal'>
有关Django Docs中DecimalField的更多信息。
FloatField:
<type 'float'>
Django Docs中有关FloatField的更多信息。
两者都适用:
我在寻找两个领域之间的差异时遇到了这个问题,因此我认为这将对处于相同情况的人们有所帮助:)
更新:要回答这个问题,我认为您可以用两种货币来表示货币,尽管十进制更适合。当它计算为浮点数时存在一个舍入问题,因此必须使用round(value, 2)
它才能使浮点表示形式舍入到两位小数位。这是一个简单的示例:
>>> round(1.13 * 50 + .01, 2)
56.51
您仍然会遇到浮动和舍入的麻烦。像这里一样,我们将其舍入为5的值:
>>> round(5.685, 2)
5.68
但是在这种情况下,它将四舍五入:
>>> round(2.995, 2)
3.0
这与浮点数在内存中的存储方式有关。看这里。
我知道这已经很老了,但是我偶然发现了它,寻找了完全不同的东西,我想抛出一个结论,通常不建议对货币使用浮点数(浮点数或十进制数),因为浮点数会四舍五入总是会导致计算中的小错误,随着时间的流逝,这些小错误可能会导致很大的差异。
而是根据您的喜好使用整数字段或字符串。将您的货币乘以将小数点后移到最后并在存储时产生一个整数,然后在需要显示时将小数点后移到其所属的位置。基本上,这就是银行(和大多数货币库)处理存储数据的方式,以后可以为您省去很多麻烦。
我很难学到这一点,因为这并不是一个常见的话题。也许这可以使别人免于做同样的事情。
>>> 10.50 - 0.20
在Python 2.7中获取10.3
。