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
它是(根据文档 )解释为一个decimal
types的常量, 也是按照文档 ,
在Transact-SQL语句中,具有小数点的常量将自动转换为数字数据值,并使用必需的最小精度和小数位数。 例如,将常量12.345转换为数值,精度为5,比例为3。
所以448.2
是decimal(4,3)
。 45
是integer
,当与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)
,出现在13
和6
。
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