我只是在查看我正在整理的报告中的一些非常小的差异,我对于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
答案 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不能被表示为浮点数。