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

vatpfxk5  于 2022-12-17  发布在  SQL Server
关注(0)|答案(4)|浏览(156)

我在SQL Server中有一个视图,类似于以下内容:

select 6.71/3.41 as NewNumber

结果为1.967741(注意6位小数)-〉decimal (38,6)
我在计算器中尝试了同样的操作,但结果是1.967741935483871xxxx
我想强制SQL Server返回更准确的结果,例如decimal(38,16)我尝试了强制转换等显而易见的方法,但SQL Server并未改善输出,只是在末尾得到一些尾随零,例如1.9677410000
是否有办法强制SQL Server不截断结果或给予更准确的结果?

cyej8jka

cyej8jka1#

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

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

返回

1.9677419354838709

检查数据类型

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

返回

numeric 38  16

编辑

这只是添加一个额外的链接作为后续的评论。规则decimaldecimal转换are described in BOL。该链接包括以下短语

  • 结果精度和小数位数的绝对最大值为38。当结果精度大于38时,相应的小数位数将减小,以防止结果的整数部分被截断。

但是没有详细说明如何执行这种截断。This is documented here

8cdiaqws

8cdiaqws2#

这是一个小的变通办法,但我认为这是值得注意的。

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
isr3a4wc

isr3a4wc3#

字面量6.71被视为一个具有固定精度的numeric,因为你在做除法,所以你改变了小数位数,当精度是最重要的时候,你不想使用小数位数,如果你想把你的数字当作是精确的,您需要将查询中的分母转换为精度更高的decimal数据类型。这应该对您有效:

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

vlju58qv4#

以下是包含小数点的简单方法:-

SELECT 5/3                          
--1

SELECT 5/(3*1.0)                    
--1.666666

SELECT ROUND((5/(3*1.0)), 2)        
--1.670000

SELECT ROUND((5/(3*1.0)), 3)        
--1.667000

但我还是找不到去掉零的方法

相关问题