SQL浮点精度限制为6位数

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

高强

CellA: 45/448.2 = 0.100401606425703 CellB: 1-CellA = 0.899598393574297 CellC: 1-CellB = 0.100401606425703 CellD: CellC * 448.2 = 45.000000000000000 

在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 

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

 declare @e decimal(18,15) = (1-(1-(45/448.2)))*448.2 

当我返回值SQL给我以下内容:

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

我已经尝试调整SQL中的小数的精度,但我没有任何区别,它只返回小数的前6位数字。

运行公式时,Excel是否做了任何优化?

有任何想法吗?

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

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

 --------------------------------------- 0.100401000000000 

这是因为数据types。 当你说

 448.2 

它是(根据文档 )解释为一个decimaltypes的常量, 也是按照文档 ,

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

所以448.2decimal(4,3)45integer ,当与decimal结合时被视为具有10的精度和0的比例 。 规则说,当我们分开时

 Operation Result precision Result scale e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1) 

在这种情况下,给出的结果精度为10 - 3 + 0 + max(6, 0 + 3 + 1)max(6, 0 + 3 + 1)比例( max(6, 0 + 3 + 1) ,出现在136

6的结果是为什么结果只有六位小数。

解决这个问题的方法就是先把你的操作数转换成适当的types, 例如,这里有两种方法:

强制一个数字被视为浮点数:

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

显式提供小数位数:

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