SQL Server截断视图中新创建的字段的小数点

Chr*_*ris 9 t-sql sql-server precision

我在SQL服务器中有一个视图,如下所示:

select 6.71/3.41 as NewNumber
Run Code Online (Sandbox Code Playgroud)

结果是1.967741(注意6个小数点) - >decimal (38,6)

我在计算器中尝试相同的事情,但结果是 1.967741935483871xxxx

我想强制SQL Server返回更准确的结果,就像decimal(38,16) 我已经尝试过像铸造这样的显而易见的东西,但是SQL Server没有改进输出我只是得到一些尾随的零结果1.9677410000

有没有办法强制SQL Server不截断结果或提供更准确的结果?

Mar*_*ith 17

如果你想要那样的东西decimal(38,16)你需要在截断已经发生之后投射输入而不是输出!

SELECT CAST(6.71 AS DECIMAL(38,18))/3.41 AS NewNumber
Run Code Online (Sandbox Code Playgroud)

返回

1.9677419354838709
Run Code Online (Sandbox Code Playgroud)

检查数据类型

SELECT 
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'BaseType'),
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'Precision'),
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'Scale')
Run Code Online (Sandbox Code Playgroud)

返回

numeric 38  16
Run Code Online (Sandbox Code Playgroud)

编辑

这只是添加一个额外的链接作为评论的后续内容.对于规则decimaldecimal转换在BOL描述.该链接包括以下短语

*结果精度和标度的绝对最大值为38.当结果精度大于38时,相应的标度会减小,以防止结果的整数部分被截断.

但是没有详细说明如何进行这种截断.这在此处记录.

  • 结果是数据类型`decimal(38,6)`.十进制除法结果精度的规则在这个链接中http://msdn.microsoft.com/en-us/library/ms190476.aspx结果精度=`p1 - s1 + s2 + max(6,s1 + p2 + 1)`result scale =`max(6,s1 + p2 + 1)`但是"当结果精度大于38时,相应的比例减小,以防止结果的整数部分被截断" (2认同)