我有一个表,其中一列有浮点值。我必须将它们相乘才能得到结果。下面是一个例子,当我使用exp(sum(log。
)时,我会得到不同的结果我做错了什么? 有没有其他方法可以这样做而不是取每个值并乘以光标?
select ( (1+ 0.01735538425366666)*(1+ 0.01768814252911706) -1) *100
declare @res numeric(38, 35), @v1 numeric(38, 35), @v2 numeric(38, 35)
select @v1=0.01735538425366666, @v2= 0.01768814252911706
select @res = ( (1+ @v1)*(1+ @v2) -1) *100
select @res
select (exp(Sum(log(1+a)))-1) * 100 from (select 0.01735538425366666 as a union select 0.01768814252911706 as a)aa
select (convert(numeric(38, 35), exp(convert(numeric(38, 35), Sum(convert(numeric(38, 35), log(convert(numeric(38, 35), 1+a)))))))-1) * 100 from (select 0.01735538425366666 as a union select 0.01768814252911706 as a)aa
-------------
create table #res(a numeric(38, 35), b float)
insert into #res (a, b)
select 0.01735538425366666, 0.01735538425366666 union
select 0.01768814252911706, 0.01768814252911706
select ((exp(sum(log(1+a))))-1) * 100 , ((exp(sum(log(1+b))))-1) * 100 from #res
--------------
&
select ( (1+ 0.01735538425366666)*(1+ 0.01768814252911706) -1) *100
应该给出相同的结果吗?
答案 0 :(得分:1)
浮点算术在某个范围之外本质上是不准确的。这是一个进入gory detail的链接,但是在StackExchange或Web上通常会出现浮点问题,你会发现这很多。
浮点数对准确性有限制。
答案 1 :(得分:1)
这不会给你相同的结果。
在您使用的一个示例中:
select ( (1+ 0.01735538425366666)*(1+ 0.01768814252911706) -1) *100
在另一个示例中,您使用#res表运行聚合函数。
select ((exp(sum(log(1+a))))-1) * 100 , ((exp(sum(log(1+b))))-1) * 100 from #res