由于货币需要精确的表示,所以不要使用像float这样的近似数据类型。您可以使用定点数值数据类型
float
decimal(15,2)
15
2
看到MySQL数字类型:
当需要保持精确的精度时,使用这些类型,例如货币数据。
你可以使用DECIMAL或NUMERIC,两者都是一样的
DECIMAL
NUMERIC
DECIMAL和NUMERIC类型存储精确的数值数据值。当需要保持精确的精确度时,例如货币数据,就会使用这些类型。在MySQL中,NUMERIC被实现为DECIMAL,因此下面关于DECIMAL的说明同样适用于NUMERIC。: MySQL <强> < em > < / em > < / >强
即。 DECIMAL(10,2)
DECIMAL(10,2)
Good read
这取决于你的需要。
使用DECIMAL(10,2)通常就足够了,但如果你需要更精确的值,你可以设置DECIMAL(10,4)。
DECIMAL(10,4)
如果处理大值,则将10替换为19。
10
19
如果你的应用程序需要处理高达万亿的货币值,那么这应该工作:13,2 如果您需要遵守GAAP(公认会计原则),则使用:13,4
通常你应该把你的货币值加到13,4,然后把输出四舍五入到13,2。
我更喜欢使用BIGINT,并通过乘以100存储值,这样它将成为整数。
BIGINT
例如,要表示93.49的货币值,该值应存储为9349,而显示可以除以100并显示的值。这将占用更少的存储空间。
93.49
9349
< p > 警告: < br > 大多数情况下,我们不执行currency * currency乘法,以防如果我们正在做乘法,然后将结果除以100并存储,以便返回适当的精度
currency * currency
实际上,这取决于程序员的偏好。我个人使用:numeric(15,4)来符合公认会计原则(<强>GAAP强>)。
numeric(15,4)
乘以10000并存储为BIGINT,就像Visual Basic和Office中的“货币”一样。看到https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
试着用
Decimal(19,4)
这通常适用于所有其他DB以及
在提出这个问题的时候,没有人考虑比特币的价格。在BTC的情况下,使用DECIMAL(15,2)可能是不够的。如果比特币将上涨到10万美元或更多,我们将至少需要DECIMAL(18,9)来支持我们的应用程序中的加密货币。
DECIMAL(15,2)
DECIMAL(18,9)
DECIMAL(18,9)在MySQL (每9位4字节)中占用12个字节的空间。
double
*喘息*
因为它可以表示任意15位数字小数点的位置没有限制。所有这些都只有可怜的8个字节!
所以它可以表示:
0.123456789012345
123456789012345.0
...以及介于两者之间的任何东西。
这很有用,因为我们处理的是全球货币,而double可以存储我们可能遇到的各种小数点后数位。
一个double字段可以用日元表示999,999,999,999,999,用美元表示99999,999,999.99,甚至用比特币表示99999,999.99999999
如果你试着用decimal做同样的事情,你需要decimal(30, 15),花费14字节。
decimal
decimal(30, 15)
当然,使用double也不是没有注意事项。
然而,这不是的准确性损失一些倾向于指出。尽管double本身可能不是内部精确到10进制,但我们可以通过从数据库中提取四舍五入来使其精确到有效的小数点后数位。如果需要的话。(例如,如果它将被输出,并且需要以10为基数的表示。)
需要注意的是,任何时候我们使用它进行算术运算时,我们都需要在以下情况下对结果进行归一化(通过四舍五入到有效的小数点位):
另一种警告是,与decimal(m, d)不同,数据库将阻止程序插入超过m数字的数字,而double不存在这样的验证。一个程序可以插入一个用户输入的20位数字,它最终会被无声地记录为一个不准确的数量。
decimal(m, d)
m
以使用更少的存储空间为理由将钱存储为BIGINT乘以100或更多,在所有“正常”情况下都没有意义。
DECIMAL(13,4)
如果要求符合GAAP,或者需要小数点后4位:
999999999美元.9999
否则,如果小数点后2位足够: 小数(13日2)< / p >
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/