我应该使用什么数据类型来存储货币价值?

Ser*_*pia 5 sql sql-server sql-server-2008

我读过我应该用,但在今天快节奏的世界里,也许现在已经过时了.

我该怎么用?

Ste*_*ass 13

Papuccino,

除非你确定你计划做的唯一算术是加法和减法,否则我不推荐使用money和s​​mallmoney类型.如果您可能正在处理汇率,百分比等问题,那么您可能会面临这些类型的实际问题.

这里只是一个小例子,告诉你在涉及分割时使用money,decimal和float之间的区别.有可能提出一些示例,其中差异更为显着.

declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;
Run Code Online (Sandbox Code Playgroud)

结果:0.0028 0.0029 0.00289855072463768

根据行业的不同,可能会有一些指导原则或法规来帮助您确定正确的数据类型.没有一个正确的答案.

补充说明:

你是正确的,钱/钱不应该是金钱,但SQL Server(莫名其妙)产生了这样的结果:从两个货币价值的商中键入货币.这是假的,但正如你从下面的例子中看到的那样,这是你得到的,即使它没有意义:

declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2
Run Code Online (Sandbox Code Playgroud)

结果:0.0028 0.0028985507246376811

类型货币0.0028的结果比正确结果少3-4%.

当然,在很多情况下您需要划分货币值.使用货币类型的危险在于商是错误的类型(并且答案与正确的类型不够接近).需要划分货币的问题示例:

假设您兑换320元,银行给您47.3美元.你获得的汇率是多少?

假设您投资23美元,一年后它的价值为31美元.你的回报率是多少?

这两种计算都需要划分货币值.

  • 我相信这是一个虚假的例子......没有真正的功能,你需要将Money分为Money并将Money作为一个outout.这没有意义......就像说3个梨/ 2个梨= 1.5个梨.这是错的.单位很重要. (2认同)

Cha*_*ana 12

不,钱应该仍然有用.

  • 数据类型与存储的数据密切相关,但与数据的显示格式无关。您真的说它很可怕吗,因为它没有指定精密离子的名称?如果这是一个有效的标准,那么 float、real、decimal(没有指定精度)和 Numeric、Integer、SmallInt 和 Tinyint 也很糟糕。他们也没有具体说明它们的大小和范围。整数应该命名为 Int32 吗?datetime 和smallDatetime 怎么样?它们应该被命名为 datetime200ms 和 datetime2sec 吗? (2认同)