【发布时间】:2013-11-21 13:49:41
【问题描述】:
在某个时候,我有一个 numeric(28,10) 并且我将它投入到 money 中(我知道这很糟糕,但由于遗留原因,我必须返回 money)同时我还必须设置符号(乘以 +1/-1)。
在第一次尝试中,我将 +/-1 转换为匹配 numeric 类型。
对于值133.3481497944,我们遇到了一个奇怪的行为(我已经简化了实际代码,以便只保留演示问题所需的元素):
SELECT CAST(CAST(133.3481497944 AS numeric(28,10))*cast(1 AS numeric(28,10)) AS money)
133.3482
没有正确四舍五入...
去掉演员表解决问题
SELECT CAST(CAST(133.3481497944 AS numeric(28,10)) * 1 AS money)
133.3481
有人知道 SQL 中发生了什么吗?乘以 1 和 cast(1 AS numeric(28,10)) 如何影响舍入结果?
【问题讨论】:
-
我认为 1 是一个红鲱鱼:
SELECT Cast(Cast(133.3481497944 As numeric(28,10)) As money)返回133.3481。这表明数字算术是问题所在。 -
是的...
SELECT Cast(133.3481497944 As numeric(28,10)) * Cast(1 As numeric(28,10))返回133.348150,因此它被四舍五入。 -
如果你想要钱,为什么要先转换成数字再转换成钱?
SELECT Cast(CAST(133.3481497944 AS money) * cast(1 as money) as money)给出 133.3481
标签: sql sql-server casting rounding