Pரத*_*ீப் -6 sql sql-server rounding-error sql-server-2012
当我将数据存储在变量/列中时,我在数据准确性方面存在问题.
请考虑以下示例
DECLARE @w NUMERIC(38, 15) = 0.458441,
@a NUMERIC(38, 15) = 10.000000,
@p NUMERIC(38, 15) = 5.000000
select (1+0.458441)*(1+ 10.000000/100)*(1+ 5.000000/100)
Run Code Online (Sandbox Code Playgroud)
结果:( 1.68449935500000000000000000正确)
SELECT ( 1 + @w ) * ( 1 + @a / 100.0 ) * ( 1 + @p / 100.0 )
Run Code Online (Sandbox Code Playgroud)
结果:( 1.684499不正确)
当我将值存储在变量中以及如何修复它时,任何人都能说出近似的原因是什么?
首先检查数据类型:
SELECT '0.458441', system_type_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT 0.458441', NULL, 0)
UNION ALL
SELECT '10.000000', system_type_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT 10.000000', NULL, 0)
UNION ALL
SELECT '5.000000', system_type_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT 5.000000', NULL, 0);
????????????????????????????????
? value ? system_type_name ?
????????????????????????????????
? 0.458441 ? numeric(6,6) ?
? 10.000000 ? numeric(8,6) ?
? 5.000000 ? numeric(7,6) ?
????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
查询1:
SELECT (1+0.458441)*(1+10.000000/100)*(1+5.000000/100)
-- 1.684499355
Run Code Online (Sandbox Code Playgroud)
查询2:
SELECT (1 + @w) * (1 + @a/100.0) * (1 + @p/100.0)
-- 1.684499
Run Code Online (Sandbox Code Playgroud)
添加铸件后:
SELECT (1 + CAST(@w AS NUMERIC(8,6))) *
(1 + CAST(@a AS NUMERIC(8,6))/100.0) *
(1 + CAST(@p AS NUMERIC(8,6))/100.0)
-- 1.684499355
Run Code Online (Sandbox Code Playgroud)
为什么会这样:相关文章