SQL Server转换算术结果

时间:2011-08-03 12:47:54

标签: sql-server-2005 sql-server-2008 inexact-arithmetic

我只是在查看我正在整理的报告中的一些非常小的差异,我对于SQL服务器中用于投射的最佳做法感到困惑,如果有人可以指出正确的方向来解释我所看到的。

在少数情况下使用类似于示例表@data中显示的数据的当前计算,会出现1p的非常小的错误。

有人能指出我正确的方向,或者至少告诉我我在看什么,以便进一步研究?

以下代码生成示例输出:

    declare @data table (qty decimal(24,12), price decimal(24,12), multiplier decimal(24,12), rate1 decimal(24,12), rate2 decimal(24,12))

    insert into @data
        select 21505.000000000000, 30.475000000000, 1.000000000000,1.166500000000, 1.166500000000


    select round(data.current_method, 2) as current_method_round, round(data.expected_result_method, 2) as expected_result_round, * from 
        (select 
        ((qty * price * multiplier) /rate1) * rate2 as current_method,
         cast(cast(cast(qty * price * multiplier as decimal(24,12)) / rate1 as decimal(24,12)) * rate2 as decimal(24,12)) as expected_result_method,
        ((21505.000000000000 * 30.475000000000 * 1.000000000000) / 1.166500000000) * 1.166500000000 as checkvalue, 
        *
        from @data ) data

2 个答案:

答案 0 :(得分:1)

您应该查看this article以了解表达式的精度和比例效果,因为乘以小数需要精度增加。

你从{<}获得two different results的事实:

       ,((qty * price * multiplier) / rate1) * rate2 as current_method
       ,((qty * price * multiplier) * rate2) / rate1 as current_method2

意味着current_method中的中间表达式存在精度问题。

答案 1 :(得分:0)

Ed ...不要在SQL中执行此操作!这种东西看起来很糟糕,应该在中间件中,可以更好地理解投射结果的含义。

[编辑]我怀疑某些东西正在转换为某个浮点,可能与除法运算符有关。 1p不能被表示为浮点数。