这听起来像是一个愚蠢的问题,但我注意到在许多电子商务相关项目的表格设计中,货币几乎总是使用decimal(19, 4)。
为什么刻度上要用4呢?为什么不是2?
也许我忽略了未来可能出现的计算问题?
这听起来像是一个愚蠢的问题,但我注意到在许多电子商务相关项目的表格设计中,货币几乎总是使用decimal(19, 4)。
为什么刻度上要用4呢?为什么不是2?
也许我忽略了未来可能出现的计算问题?
首先,其他答案中有一些错误的建议。请注意以下内容(在64位架构的64位操作系统上):
declare @op1 decimal(18,2) = 0.01
,@op2 decimal(18,2) = 0.01;
select result = @op1 * @op2;
result
---------.---------.---------.---------
0.0001
(1 row(s) affected)
注意标题下划线的数量-共39个(我每隔十个用句点替代以便计数)。这恰好足够38个数字(最大允许值,并且64位CPU上默认值)加上显示的小数点。虽然两个操作数都声明为decimal(18,2),但计算是使用decimal(38,4)数据类型进行的并报告了结果。(我在64位机器上运行SQL 2012-某些细节可能因机器架构和操作系统而异。)类似于汽油价格会使用额外的“刻度”位置。你肯定见过每加仑1.959美元的汽油价格,对吧?
在SQL中,19是整数的数量,4是小数的数量。
如果你只有2个小数位,并且存储了一些计算结果,导致超过2个小数位,那么“没有办法”存储这些额外的小数位。
一些货币使用超过2个小数位。
使用数据类型decimal而不是money。
当使用十进制数时,根据您的业务需求,您可以自行决定如何使用。
但是,当您在SQL中使用Money数据类型时,默认情况下会存储4位小数。
虽然OP的问题是关于比例尺的,但让我们来探讨一下为什么19是SQL Server上十进制数的流行精度。
根据this文档,这是十进制数使用的存储空间:
精度 | 存储字节 |
---|---|
1 - 9 | 5 |
10-19 | 9 |
20-28 | 13 |
29-38 | 17 |
因此,1个精度使用的空间与9相同,而10使用的空间与19相同。
在实际应用中,9对于货币来说可能太少了,特别是如果您选择4的比例尺,那么您将处于-99999.9999和99999.9999之间。
但对于任何可以想象到的情况,19足矣,这也是SQL Server货币数据类型使用它的原因。
如果数据库中存在一些错误数据,可以使用28或38以防止转换时出现错误。
DECIMAL(19, 4)
是一个受欢迎的选择,可以参考这里,也可以查看这里世界货币格式来决定使用多少小数位,希望有所帮助。 - Shaiju T