为了账号安全,请及时绑定邮箱和手机立即绑定

T-SQL十进制分区准确度

/ 猿问

T-SQL十进制分区准确度

斯蒂芬大帝 2019-09-03 15:55:26

有谁知道为什么,使用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


查看完整描述

3 回答

?
胡说叔叔

对于乘法,我们只需将每个参数中的小数位数加在一起(使用钢笔和纸张)来计算输出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


查看完整回答
反对 回复 2019-09-03
?
守着星空守着你

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


查看完整回答
反对 回复 2019-09-03
?
哆啦的时光机

我们对魔术过渡感到困惑,

P&S是相互关联的,因此:

  1. (72,54) - >(38,29)

  2. (84,54) - >(38,8)

假设(38,29)是一个错字,应该是 (38,20),以下是数学:

  1. 一世。72 - 38 = 34,ii。54 - 34 = 20

  2. 一世。84 - 58 = 46,ii。54 - 46 = 8

这就是推理:

一世。输出精度减去最大精度是我们要扔掉的数字。

II。那么输出比例减去我们要扔掉的东西给我们...输出比例中的剩余数字。

希望这有助于其他任何人试图理解这一点。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 72 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信