我想在MySQL数据库中存储许多记录。它们都包含货币值。但是我不知道每个值会插入多少位数。
为此,我应该使用哪种数据类型?
VARCHAR还是INT(或其他数字数据类型)?
我想在MySQL数据库中存储许多记录。它们都包含货币值。但是我不知道每个值会插入多少位数。
为此,我应该使用哪种数据类型?
VARCHAR还是INT(或其他数字数据类型)?
由于货币需要精确的表示,因此不要使用仅近似的数据类型,如float
。您可以使用固定点数值数据类型。
decimal(15,2)
15
是精度(值的总长度,包括小数位)2
是小数点后的位数请参考MySQL 数字类型:
这些类型用于在处理货币等数据时需要保留精确的精度。
decimal
和numeric
是相同的。 - juergen dnumeric(19,4)
,这样可以更灵活地应对新的需求。 - YahyaE我更喜欢使用 BIGINT
,并通过 乘以 100 将值存储,使其成为整数。
例如,要表示货币价值 93.49
,则将其存储为9349
,在显示该值时,我们可以 除以 100 并显示。这将占用更少的存储空间。
注意:
大多数情况下,我们不进行货币 * 货币
的乘法运算,但如果确实需要进行此操作,则应将结果除以 100 并存储,以便返回正确的精度。
DECIMAL
,有什么优势呢?使用它会需要将分转换为元,如果忘记了就会出现问题。 - user565869DECIMAL
。但是,如果您不了解精度(就像我的例子一样),那么使用FLOAT
是否合适? - Quinn Comendant这取决于您的需求。
通常使用 DECIMAL(10,2)
就足够了,但如果您需要更精确的值,可以设置为 DECIMAL(10,4)
。
如果你需要处理大数值,请将 10
替换为 19
。
如果您的应用程序需要处理高达一万亿的货币价值,那么这应该可以胜任:13.2。
如果您需要遵守GAAP(普遍公认会计原则),则应使用:13.4。
通常情况下,您应在将输出舍入为13.2之前将货币价值相加至13.4。
double
。*喘气*
因为它可以表示任何15位数字,而不受小数点位置的限制。只需8个字节!
这样可以表示:
0.123456789012345
123456789012345.0
......以及它们之间的任何值。
这很有用,因为我们正在处理全球货币,而double
可以存储我们可能遇到的各种小数位数。
一个单一的double
字段可以表示999,999,999,999,999日元,9,999,999,999,999.99美元甚至是9,999,999.99999999比特币。
如果你尝试使用decimal
,你需要decimal(30, 15)
,这将花费14个字节。
当然,使用double
并非没有注意事项。
然而,它不会失去精度,正如某些人所指出的那样。尽管double
本身可能不是基于10进制的内部精确表示,但我们可以通过将从数据库中提取的值舍入到其有效小数位数来使其精确。如果需要的话。(例如,如果要输出并且需要基于10进制表示法。)
注意事项在于,每次对它执行算术运算时,我们需要在:
另外一个需要注意的地方是,与 decimal(m, d)
不同的是,数据库无法防止程序插入超过 m
个数字的数字。而对于 double
类型则不存在这种验证。程序可能会插入一个20位数的用户输入值,然后它就会以不准确的金额被默默地记录下来。
2.9699999999999998
远远超过 15 位数字的精度。你需要知道你的货币有多少个有效数字并将其舍入到该数字。如果是满 15 位,那么它将是 2.97000000000000
,但你从 0.99
开始,所以可能是两位,因此是 2.97
。详情请参见注意事项。 - antak2.9699999999999998
远超过15位数字。您需要知道您的货币有多少个有效数字,并对其进行四舍五入。如果是15位有效数字,结果将为2.97000000000000
,但您从0.99
开始,所以可能只有两位有效数字,即2.97
。详细内容请参阅注意事项。 - antakdecimal(15)
中一样。你不需要在算术运算期间四舍五入,但是在控制台上看到 2.9699999999999998
这样的数字是浮点数的特性,因为字符串化程序不知道你想要多少位数字。 - antakdecimal(15)
中一样。在算术运算过程中不需要四舍五入,但是在控制台上打印出'2.9699999999999998'这样的字符串是浮点数的特性,因为字符串化程序无法知道你想要多少位数。 - antak当提出这个问题时,没有人考虑比特币的价格。对于BTC来说,使用DECIMAL(15,2)
可能是不够的。如果比特币价格上涨到10万美元或更高,我们需要至少DECIMAL(18,9)
来支持我们应用程序中的加密货币。
DECIMAL(18,9)
在MySQL中占用8个字节的空间(每9位数字占用4个字节)。
DECIMAL(13, 4)
支持最大值为:
$999,999,999.9999DECIMAL(13,2)
来源:https://rietta.com/blog/best-data-types-for-currencymoney-in/
实际上,这取决于程序员的喜好。我个人使用:numeric(15,4)
来符合 通用会计准则(GAAP)。
尝试使用
Decimal(19,4)
通常这也适用于其他数据库。