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

问题描述 投票:0回答:4

我在 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 不截断结果或提供更准确的结果?

sql-server t-sql precision
4个回答
17
投票

如果您想要类似

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

##编辑

这只是添加一个附加链接作为评论的后续内容。 BOL

 中描述了 
decimal
decimal 转换 的规则。该链接包含以下短语

*结果精度和小数位的绝对最大值为 38。 结果精度大于38, 相应的尺度缩小为 防止结果的积分部分 以免被截断。

但未具体说明如何执行此类截断。 这记录在此处(回溯机器链接)


3
投票

这是一个解决方法,但我认为值得一提。

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

3
投票

文字 6.71 被视为具有固定精度的

numeric
。 由于您正在进行除法,因此您正在更改小数位数,当准确性至关重要时,这不是您想要使用的内容。 如果您想将数字视为准确的,则需要将查询中的分母转换为具有更大精度的
decimal
数据类型。 这应该对你有用:

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

0
投票

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

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

但是我仍然找不到删除零的方法

© www.soinside.com 2019 - 2024. All rights reserved.