0

我只是在我整理的报告中查看一些非常小的差异,我很困惑 SQL Server 中用于投射的最佳实践是什么,如果有人可以指出正确的方向来解释我的内容我看到了。

使用与示例表中所示数据相似的当前计算,在少数情况下会出现非常小的 1p 误差@data

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

下面的代码产生示例输出:

    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
4

2 回答 2

1

您可能应该看看这篇文章以了解表达式的精度和比例效应,因为乘以小数需要增加精度。

事实上,你会得到两个不同的结果

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

暗示您 current_method 中的中间表达式存在精度问题。

于 2011-08-11T14:47:18.773 回答
0

Ed...不要在 SQL 中这样做!这种东西看起来很可怕,应该放在中间件中,这样可以更好地理解转换结果的含义。

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

于 2011-08-11T14:29:10.340 回答