我在 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 不截断结果或提供更准确的结果?
如果您想要类似
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, 相应的尺度缩小为 防止结果的积分部分 以免被截断。
但未具体说明如何执行此类截断。 这记录在此处(回溯机器链接)。
这是一个解决方法,但我认为值得一提。
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 被视为具有固定精度的
numeric
。 由于您正在进行除法,因此您正在更改小数位数,当准确性至关重要时,这不是您想要使用的内容。 如果您想将数字视为准确的,则需要将查询中的分母转换为具有更大精度的 decimal
数据类型。 这应该对你有用:
select 6.71 / cast(3.41 as decimal(18, 8)) as NewNumber
这是包含小数点的简单方法:-
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
但是我仍然找不到删除零的方法