当前位置:  开发笔记 > 数据库 > 正文

T-SQL十进制分区准确度

如何解决《T-SQL十进制分区准确度》经验,为你挑选了3个好方法。

有谁知道为什么,使用SQLServer 2005

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)

给了我11.74438969709659,

但是当我将分母上的小数位数增加到15时,我会得到一个不太准确的答案:

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

给我11.74438969



1> gbn..:

对于乘法,我们只需将每个参数中的小数位数加在一起(使用钢笔和纸张)来计算输出dec位置.

但师只是把你的头分开了.我现在要躺下了.

但在SQL术语中,它完全符合预期.

--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1)
--Scale = max(6, s1 + p2 + 1)

--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)


--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

如果您将每个数字对视为,则如果遵循此规则,您也可以执行相同的数学运算

146804871.212533000000000和12499999.999900000

146804871.212533000000000和12499999.999900000000000


不幸的是,SQL Server在算术上非常糟糕:(因此,如果您需要在t-sql中进行乘法和除法的准确结果,最好的选择是:定义和使用CLR函数。请参阅:http: //www.skylinetechnologies.com/Insights/Skyline-Blog/March-2013/CLR-Functions-in-SQL-Server-A-Tutorial以获得良好的介绍

2> 小智..:

简而言之,使用DECIMAL(25,13)并且你可以完成所有计算 - 你将获得正确的精确度:小数点前12位,后面13位小数.规则是:p + s必须等于38,你才会安全!为什么是这样?因为SQL Server中的算术执行非常糟糕!在他们解决之前,请遵循该规则.



3> 小智..:

我注意到如果你将分割值转换为float,它会给你正确的答案,即:

select 49/30                   (result = 1)

会成为:

select 49/cast(30 as float)    (result = 1.63333333333333)

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有