我在excel中有以下一组计算,我希望能够在存储过程中使用它们。
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在运行公式时会做任何优化吗?
有什么想法吗?
发布于 2013-04-09 00:09:55
即使是你的第一行代码也足以说明问题:
declare @a decimal(18,15) = 45/448.2
print @a
给出
---------------------------------------
0.100401000000000
这是由于数据类型的原因。当你说
448.2
它(根据the documentation)被解释为decimal
,和also per the documentation类型的常量,
在Transact-SQL语句中,带有小数点的常量将使用所需的最小精度和小数位数自动转换为数值数据值。例如,常量12.345被转换为精度为5、小数位数为3的数值。
所以448.2
就是decimal(4,3)
。当与decimal
is treated as having precision of 10 and scale 0结合使用时,45
就是integer
,。当我们分开时,the rules说
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)
的小数位数,这得出了13
和6
。
6
的结果比例就是为什么结果只有六位小数的原因。
修复它的方法是在对操作数进行操作之前将其转换为适当的类型;例如,以下是两种方法:
强制将数字视为浮点数:
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
https://stackoverflow.com/questions/15883606
复制相似问题