我很好奇哪一个更适合作为货币域?我会做一些简单的操作,比如取差值,新旧价格之间的百分比。我计划在零(即10.50)之后保留两位数,如果这些数字大部分时间是零,我将隐藏这些数字并将其显示为"10“
ps:货币不是以美元为基础的:)
发布于 2010-04-03 04:34:10
总是使用DecimalField
来赚钱。即使是简单的运算(加法、减法)也不能幸免于浮点舍入问题:
>>> 10.50 - 0.20
10.300000000000001
>>> Decimal('10.50') - Decimal('0.20')
Decimal('10.30')
发布于 2014-12-13 00:44:40
这个问题的答案是正确的,但是一些用户会偶然发现这个问题,以找出DecimalField
和FloatField
之间的区别。Seth提出的浮点舍入问题是一个货币问题。
Django文档状态
FloatField
类有时会与DecimalField
类混淆。虽然它们都表示实数,但它们表示这些数字的方式不同。FloatField
在内部使用Python的float
类型,而DecimalField
使用Python的Decimal
类型。
阅读更多here。
以下是两个字段之间的其他区别:
DecimalField:
decimal_places
设置为4
,并且你输入了一个4.00000
(5位)的小数,你将会得到这样的错误:确保总共不超过4位。0.1
.0.001
is decimal.Decimal
‘t0.1
.DecimalField
Decimal
type,由于需要如上所述地设置所需的属性,系统还会为您处理舍入。因此,在shell中,如果您在数据库(postgresql)中执行DecimalField
保存为主类型,并将存储设置为“numeric(max_digits, decimal_places)
”,从上面的示例中,类型为postgresql更多关于DecimalField from the Django Docs的信息。
FloatField:
<type 'float'>
<type 'float'>
FloatField
将另存为“双精度”类型,并且存储被设置为“普通”更多关于FloatField from the Django Docs的信息。
适用于以下两种情况:
Field
类扩展而来的,可以接受blank
、null
、verbose_name
、name
、primary_key
、max_length
、D66、D67、D68、D69、D70、D71、D72、D73、D74、D75、D76、D77、D78、D79、D80、D81属性、与从Field
扩展的所有字段一样,这两个字段的默认表单小部件都是TextInput
.。
我在寻找这两个字段之间的差异时遇到了这个问题,所以我认为这会对那些处于相同情况的人有所帮助:)
更新:为了回答这个问题,我认为你可以使用这两种语言中的任何一种来表示货币,尽管Decimal
更适合。当计数为浮点数时,存在舍入问题,因此您必须使用round(value, 2)
,以便将float
表示四舍五入到小数点后两位。下面是一个快速示例:
>>> round(1.13 * 50 + .01, 2)
56.51
你仍然会在使用float
和round
时遇到麻烦。就像这里,我们看到它向下取整的值是5
>>> round(5.685, 2)
5.68
但在本例中,它将四舍五入:
>>> round(2.995, 2)
3.0
它与浮点数在内存中的存储方式有关。参见here。
发布于 2018-05-17 01:28:34
我知道这太老了,但我偶然发现它是为了寻找完全不同的东西,我想指出,一般来说,使用浮点数(浮点或小数)作为货币是不可取的,因为浮点数学四舍五入总是会导致计算中的小误差,随着时间的推移,可能会增加非常大的误差。
相反,可以根据自己的喜好使用整型字段或字符串。将货币相乘以将小数位移到末尾,并在存储时生成一个整数,然后在需要显示小数位时将小数位移回原来的位置。这基本上是银行(和大多数货币库)处理存储数据的方式,并将在以后为您省去大量的麻烦。
我很艰难地学会了这一点,因为这并不是一个常见的话题;也许这可以让其他人避免做同样的事情。
https://stackoverflow.com/questions/2569015
复制相似问题