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

Sql server SQL Server截断视图中新创建字段的小数点,sql-server,tsql,precision,Sql Server,Tsql,Precision,我在SQL server中有一个视图,如下所示: select 6.71/3.41 as NewNumber 结果是1.967741(注意6个小数点)->十进制(38,6) 我在计算器中尝试了同样的方法,但结果是1.967741935483871xxxx 我想强制SQL Server返回更精确的结果,比如decimal(38,16) 我尝试过一些明显的方法,比如强制转换,但是SQL Server并没有改善输出,我只是在末尾得到一些尾随的零,比如1.9677410000 有没有办法强制SQL S

我在SQL server中有一个视图,如下所示:

select 6.71/3.41 as NewNumber
结果是
1.967741
(注意6个小数点)->
十进制(38,6)

我在计算器中尝试了同样的方法,但结果是
1.967741935483871xxxx

我想强制SQL Server返回更精确的结果,比如
decimal(38,16)
我尝试过一些明显的方法,比如强制转换,但是SQL Server并没有改善输出,我只是在末尾得到一些尾随的零,比如
1.9677410000


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

这是一种变通方法,但我认为值得注意

select ((6.71*10000)/(3.41*10000)) as NewNumber
此查询:

SELECT 6.71/3.41, ((6.71*1000000)/(3.41*1000000)) as NewNumber
返回:

1.967741    1.96774193548387

文字6.71被视为具有固定精度的数值。因为你在做除法,所以你在改变小数位数,这不是你想在精度至上的时候使用的。如果希望将数字视为精确的,则需要将查询中的分母转换为精度更高的
decimal
数据类型。这应该适合您:

select 6.71 / cast(3.41 as decimal(18, 8)) as NewNumber

如果您想要类似于
decimal(38,16)
的东西,那么您需要在截断已经发生之后转换输入而不是输出

SELECT CAST(6.71 AS DECIMAL(38,18))/3.41 AS NewNumber
返回

1.9677419354838709
numeric 38  16
检查数据类型

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')
返回

1.9677419354838709
numeric 38  16
编辑 这只是为了添加一个附加链接,作为评论的后续。
decimal
decimal
转换的规则。该链接包括以下短语

*结果精度和刻度绝对最大值为38。当 结果精度大于38, 相应的比例降低到 防止结果的不可分割部分 避免被截断


但没有具体说明这种截断是如何执行的

为什么Cast(6.71作为十进制(38,16))/Cast(3.41作为十进制(38,16))返回1.967741?结果是数据类型
十进制(38,6)
。十进制除法结果精度的规则在此链接中为result precision=
p1-s1+s2+max(6,s1+p2+1)
result scale=
max(6,s1+p2+1)
但“当结果精度大于38时,相应的刻度将减小,以防止结果的整数部分被截断”谢谢马丁,其他人都在工作,你的答案很全面