gpt4 book ai didi

sql-server - 为什么在SQL Server 中乘DECIMAL 时会出现精度损失?

转载 作者:行者123 更新时间:2023-12-02 19:20:35 26 4
gpt4 key购买 nike

在 SQL Server 中运行这个脚本(我的版本是 SQL Server 2016):

DECLARE @num1 DECIMAL(20,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result

结果:

Result
---------------------------------------
0.00000050000

结果为 0.00000050000 小数位数 DECIMAL(X,11)

现在,如果我们按如下方式更改脚本:

DECLARE @num1 DECIMAL(21,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result

结果:

Result
---------------------------------------
0.0000005000

您可以看到结果是 0.0000005000,似乎比例缩小为 DECIMAL(X,10)

继续提高@num1的精度:

DECLARE @num1 DECIMAL(22,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result

结果:

Result
---------------------------------------
0.000000500

现在结果是 0.000000500,看起来小数位数缩小为 DECIMAL(X,9)

我想问一下两个DECIMAL数值计算后的准确精度和小数位数是多少。如果我们将两个 DECIMAL 数字相乘,似乎会有严重的精度损失。由于精度损失,以下脚本将给出完全错误的结果,这将舍入超出结果范围的分数。

DECLARE @num1 DECIMAL(25,7)
DECLARE @num2 DECIMAL(20,7)
DECLARE @num3 DECIMAL(25,7)
DECLARE @num4 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SET @num3 = 0.0000004
SET @num4 = 1.0
SELECT @num1 * @num2 AS Result1, @num3 * @num4 AS Result2

结果:

Result1                                 Result2
--------------------------------------- ---------------------------------------
0.000001 0.000000

最佳答案

当你在问题中进行乘法时,实际的精度和比例是根据这些计算的 rules :

  • 结果精度和小数位数的绝对最大值为 38。
  • 结果精度为p1 + p2 + 1,结果尺度为s1 + s2(p1 and s1是第一个表达式的精度和小数位数,p2s2 是第二个表达式的精度和小数位数)。
  • 如果整数部分小于 32,则结果比例减小到 min(scale, 38 - (precision-scale)),因为它不能大于 38 - (precision-规模)。在这种情况下,结果可能会四舍五入

因此,在您的示例中:

DECLARE @num1 DECIMAL(20,7)
DECLARE @num2 DECIMAL(20,7)
SET @num1 = 0.0000005
SET @num2 = 1.0
SELECT @num1 * @num2 AS Result

scale 的实际计算是:

  • 7 + 7 = 14
  • 分钟 (14, 38 - ((20 + 20 + 1) - (7 + 7))) = 11

关于sql-server - 为什么在SQL Server 中乘DECIMAL 时会出现精度损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63114139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com