CAST未正确舍入

时间:2017-01-10 20:14:04

标签: sql sql-server-2012

如果你看下面,语法是相同的,但一个是拉变量来计算,而另一个是硬编码值。结果是不同的,我迷失了为什么会发生这种情况。有人有解释吗?

CAST(Amount / Quantity AS DECIMAL(10, 4)) AS [Price1], --36.5087
CAST(584.14 / 16 AS DECIMAL(10, 4)) AS [Price2], --36.5088

3 个答案:

答案 0 :(得分:2)

重现OP结果的简单示例,MS Sql

SELECT
    CAST(CAST(584.14 AS FLOAT) / 16  AS DECIMAL(10, 4)) AS [Price1],
    CAST(584.14 / 16 AS DECIMAL(10, 4)) AS [Price2]

介意数据类型和转换规则。

答案 1 :(得分:1)

我假设你使用的是SQL Server(基于方括号)。

您看到的问题是因为文字的类型与列的类型不同。文字的类型是十进制的,并且在分割十进制数时有精确度和比例的特定规则。 "具体"并不意味着简单或直观。但they已有详细记录。

为什么这会有所不同?那么,不同的表示可能导致不同的结果。差异很小,但可能会显示在不太重要的小数位。

答案 2 :(得分:1)

@Drew在做一些研究时我发现了这个链接

https://msdn.microsoft.com/en-us/library/ms187752.aspx

其中说我们知道Float 近似数字 vs Decimal Exact Numerics

关于进一步调查我发现了这个链接

https://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

特别是这个段落

  

近似数值数据类型不存储指定的确切值   很多数字;他们存储了非常接近的近似值   值。对于很多应用来说,微小的区别   指定值和存储的近似值不明显。在   但是,时间差异变得明显。因为   浮点数和实数数据类型的近似性质,请勿使用这些   需要精确数字行为时的数据类型,例如   财务申请,涉及四舍五入的业务,或在   平等检查。而是使用整数,小数,金钱或   smallmoney数据类型。

所以如果您打算为财务应用程序使用decimal而不是float,请回答您的问题;)