SQL浮点精度限制为6位数

Sca*_*dle 5 sql t-sql excel excel-formula

我在excel中有以下一组计算,我希望能够在存储过程中使用.

高强

CellA: 45/448.2 = 0.100401606425703
CellB: 1-CellA = 0.899598393574297
CellC: 1-CellB = 0.100401606425703
CellD: CellC * 448.2 = 45.000000000000000
Run Code Online (Sandbox Code Playgroud)

在SQL中我正在做以下事情:

declare @a decimal(18,15) = 45/448.2  
declare @b decimal(18,15) = 1-@a
declare @c decimal(18,15) = 1-@b
declare @d decimal(18,15) = @c * 448.2
Run Code Online (Sandbox Code Playgroud)

我也试过在一行中运行计算

declare @e decimal(18,15) = (1-(1-(45/448.2)))*448.2
Run Code Online (Sandbox Code Playgroud)

当我返回值时,SQL给出了以下内容:

@a: 0.100401000000000
@b: 0.899599000000000
@c: 0.100401000000000
@d: 44.999728200000000

@e: 44.999728200000000
Run Code Online (Sandbox Code Playgroud)

我已经尝试在SQL中调整小数的精度,但我没有什么区别,它只返回小数的前6位数.

Excel在运行公式时是否进行任何优化?

有任何想法吗?

Aak*_*shM 7

即使只是你的第一行足以显示问题:

declare @a decimal(18,15) = 45/448.2  
print @a
Run Code Online (Sandbox Code Playgroud)

---------------------------------------
0.100401000000000
Run Code Online (Sandbox Code Playgroud)

这是因为数据类型.当你说

448.2
Run Code Online (Sandbox Code Playgroud)

它(根据文档)被解释为类型的常量decimal,并且根据文档,

在Transact-SQL语句中,具有小数点的常量将使用所需的最小精度和小数位自动转换为数字数据值.例如,常量12.345将转换为精度为5且比例为3的数值.

所以448.2decimal(4,3).45integer,当与a组合时decimal 被视为具有10的精度和0的标度.当我们分裂时,规则

Operation     Result precision                        Result scale
e1 / e2       p1 - s1 + s2 + max(6, s1 + p2 + 1)      max(6, s1 + p2 + 1)
Run Code Online (Sandbox Code Playgroud)

在这种情况下给出的结果的精度10 - 3 + 0 + max(6, 0 + 3 + 1)和规模max(6, 0 + 3 + 1),其中就出来136.

结果的大小6是为什么结果只有那六个小数位.

修复它的方法是在操作之前将操作数转换为适当的类型; 例如,这有两种方式:

强制将某个数字视为浮点数:

declare @a decimal(18,15) = 45/448.2e0  
select @a

---------------------------------------
0.100401606425703
Run Code Online (Sandbox Code Playgroud)

明确提供小数位:

declare @a decimal(18,15) = 45/cast(448.2 as decimal(18,10))
select @a

---------------------------------------
0.100401606425703
Run Code Online (Sandbox Code Playgroud)