2013-03-18 94 views
0

我需要SQL专家的帮助。我试图获取带有4位小数的数据。我正在计算“钱”类型。但是,这个计算并不符合我的喜好。如何正确舍入SQL钱类型?

下面是一个具有常规数字和相同货币类型值的示例。

DECLARE @MaxAmt money 
DECLARE @MinAmt money 

SET @MaxAmt = 207998693.55 
SET @MinAmt = 20799442.35 

SELECT 
((207998693.55 - 20799442.35)/2 + 20799442.35)/24 AS Col1, 
((@MaxAmt - @MinAmt)/2 + @MinAmt)/24 AS Col2 

Col1中显示值等于4766627.831250000 虽然具有Col2中值4766627.8312。

我的目标是只显示4位十进制数字,但它应该正确地舍入。我期望4766627.8313的价值。

下面的投射后会显示哪一个。

SELECT CAST(((207998693.55 - 20799442.35)/2 + 20799442.35)/24 AS DECIMAL(12,4)) 

但是,当我处理金钱键入我的价值后,小数是0.8312而不是0.8313

+1

这是因为您的MONEY计算可能使用了[Banker's Rounding](http://en.wikipedia.org/wiki/Rounding#Round_half_to_even) - 我假设有一个系统设置;你使用的是什么RDBMS? – 2013-03-18 21:38:57

+0

我正在使用MS SQL。我可以做些什么来获得我需要的舍入? – Vadim 2013-03-18 21:49:35

+1

...通过文档快速浏览并不能揭示任何内容;我怀疑你可能必须首先将列转换为“DECIMAL”:它很可能在实际评估过程中四舍五入,因此您必须提前告诉它需要什么(更大)的类型。 – 2013-03-18 22:25:48

回答

2

这种现象最可能的解释是,Money类型是使用什么作为Banker's Rounding(一审查该页面应该揭示这个选择的可能原因)。

通过文档浏览,似乎没有任何“内置”来改变这一点 - 如果要在SQL本身中执行此操作,您可能需要先明确地将其转换为DECIMAL。 (替代方法包括将至少一些计算拉出到应用程序层,必要时或写入存储过程)。

+0

感谢您的帮助。 – Vadim 2013-03-19 00:17:21