SQL Server舍入问题

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不正确)

当我将值存储在变量中以及如何修复它时,任何人都能说出近似的原因是什么?

Luk*_*zda 5

首先检查数据类型:

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)

LiveDemo

为什么会这样:相关文章