没有人知道为什么,使用Sql server2005年

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

有帮助吗?

解决方案

乘我们简单地添加的小数位位数,在每个参数一起(利用笔和纸)的工作输出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

其他提示

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

我注意到如果你将分频值转换成浮动,它会给你正确的答案,即:

select 49/30                   (result = 1)

会变成:

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

我们令人费解了魔法的过渡,

P&S链接,所以:

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

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

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

  1. i。72-38=34, 二。54-34=20

  2. i。84-58=46, 二。54-46=8

这是推理:

i。输精度小最精密的数字,我们要扔掉。

二。然后输出的比例低什么我们要扔给了我们...其余的数字输出的规模。

希望这有助于其他任何人试图弄懂这个。

转换表达式而不是参数。

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)

使用以下内容可能有所帮助:

SELECT COL1 * 1.0 / COL2
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top