0

为什么会这样

weightedValue = CAST(prob*value as FLOAT(53))/CAST(totalValue as FLOAT(53))

完整返回十进制答案,但这

weightedValue = CAST(prob*value as DECIMAL(38,14))/CAST(totalValue as DECIMAL(38,14))

返回在小数点后 6 位截断的十进制答案?

'Prob' 被声明为 DECIMAL(16,14),'value' 是 DECIMAL(17,0),'weightedValue' 都是十进制值并假设总值不超过超出 DECIMAL(38,14) 规范.

除非我遗漏了什么,否则 DECIMAL(38,14) 符号应该给出一个最多 38 个总数和最多 14 个小数精度的值。因此,我不应该在结果中遇到任何截断,不是吗?

此外,我以前认为使用 DECIMAL(,) 总是优于使用 FLOAT() 基于浮点算术中隐含的不精确性以及与结果相关的不确定性——DECIMAL() 可用于做任何 FLOAT() 可以做的事情,但反之亦然。我错过了什么,事实上,不是这样吗?

4

1 回答 1

1

问题在于 SQL Server 如何处理小数除法(或乘法)。

结果精度的公式如下:

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

所以,当你有 a 时DECIMAL(38,14)/DECIMAL(38,14),你会得到一个精度

38 - 14 + 14 + 最大值(6, 14 + 38 + 1)= 81

因此,您的结果将是 DECIMAL(81,43),远远超过允许的 (38,14)。因此,SQL Server 会自动截断答案。

有关更详细的说明,请参阅blogs.msdn.com 。

于 2012-08-17T00:20:59.407 回答