以下TSQL语句根据@Size和@ Value的顺序返回不同的值.第一个语句返回1687.500000但第二个语句返回1687.600000.我猜它是因为一些四舍五入但我无法弄清楚自己.任何帮助将非常感激.
DECLARE @Amount DECIMAL(20,4) = 2,
@PriceDiff DECIMAL(25,10) = 0.421875,
@Size DECIMAL(16,4)= 200000.0000,
@Value DECIMAL(25,15)= 0.010000000000000
SELECT @Amount * @PriceDiff * @Size * @Value AS FinalValue
SELECT @Amount * @PriceDiff * @Value * @Size AS FinalValue
Run Code Online (Sandbox Code Playgroud)
您遇到舍入错误的原因是由于SQL Server确定Decimal类型的精度和比例的乘法结果的方式.看这里
此外,SQL Server对相同/等于优先级运算符的操作顺序是LTR.
鉴于第一步是多个@Amount*@PriceDiff.根据该链接,精度和规模将是:
precision = 20 + 25 + 1 = 46
scale = 4 + 10 = 14
resulting data type = Decimal(46, 14)
Run Code Online (Sandbox Code Playgroud)
这个结果超过了Decimal的最大允许精度,所以事情变得有点粘.在该链接的底部,您将看到:
- 结果精度和标度的绝对最大值为38.当结果精度大于38时,相应的标度会减小,以防止结果的整数部分被截断.
进一步阅读这一点你会发现,不是只是删掉所有的小数位来制作一个Decimal(38,0)或允许所有精度到十进制的Decimal(38,38)SQL服务器做一个很大的猜测并使它成为一个Decimal(38,6).
一切都很好,但我们的结果到目前为止,0.84375并且适合我们的新Decimal(38,6)容器.
您现在可以看到,如果我们乘这你@Size我们仍然将是一个范围内Decimal(38,6)使用的结果168750.因此,即使使用精度和比例数学,我们仍然很好,并且得到的舍入将达到6的标度.
但是,如果我们得到那个0.84375结果和多个结果,@Value我们得到:
precision = 38 + 25 + 1 = 64
scale = 6 + 15 = 21
result = Decimal(64, 21)
Run Code Online (Sandbox Code Playgroud)
这意味着我们又将它强制转换为十进制(38,6)...并且0.0084375不合适,所以它是圆形的0.08438.
| 归档时间: |
|
| 查看次数: |
35 次 |
| 最近记录: |