请教一sql查询数值精度问题!
我有一表 test
id (int),a (float),b (float), c float
1
2
现欲更新这表如sql语句写成:
declare @a float,@b float
set @a=90116.3
set @b=1876.0
update test
set c=@a*@b
where id=1
则c值为1.69058e+008
如sql语句写成:
update test
set c=90116.3*1876.0
where id=1
则c值为169058178.80000001
两次c值相差较大,显然第二种方法更为精确
现我想通过第一种方法即变量赋值方式如何得到
精确的值169058178.80000001?
请高手赐教!
问题点数:100、回复次数:10Top
1 楼zjcxc(邹建)回复于 2005-04-27 11:59:02 得分 60
float本来就是浮点数,非精度数据
保存到变量中的时候,因为保存的关系,所以会丢失一些精度,再取出来计算,显然结果就会差得更远.Top
2 楼zjcxc(邹建)回复于 2005-04-27 12:01:18 得分 0
--我的电脑上,两种的测试相同,所以还可以看出不同的电脑处理会有不同的结果
declare @t table(c float)
insert @t select 1
declare @a float,@b float
set @a=90116.3
set @b=1876.0
update @t set c=@a*@b
select * from @t
--结果:169058178.80000001
update @t set c=90116.3*1876.0
select * from @t
--结果:169058178.80000001
Top
3 楼zjcxc(邹建)回复于 2005-04-27 12:02:38 得分 0
用变量的话,你可以使用decimal来保存,然后将计算结果存入表中.Top
4 楼xcwlbl()回复于 2005-04-27 12:04:15 得分 0
我怀疑是第一种方法结果采用指数方式,而指数方式小数点只保留5位所以造成误差,那又该如何解决这一问题呢?Top
5 楼xluzhong(Ralph)回复于 2005-04-27 12:07:48 得分 20
--在我的电脑上,两种的测试 也是 相同,所以还可以看出不同的电脑处理会有不同的结果
declare @t table(c float)
insert @t select 1
declare @a float,@b float
set @a=90116.3
set @b=1876.0
update @t set c=@a*@b
select * from @t
--结果:169058178.80000001
update @t set c=90116.3*1876.0
select * from @t
--结果:169058178.80000001Top
6 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2005-04-27 12:44:16 得分 20
同意邹老大和楼上的意见:
--在我的电脑上,两种的测试 也是 相同,所以还可以看出不同的电脑处理会有不同的结果
declare @t table(c float)
insert @t select 1
declare @a float,@b float
set @a=90116.3
set @b=1876.0
update @t set c=@a*@b
select * from @t
--结果:169058178.80000001
update @t set c=90116.3*1876.0
select * from @t
--结果:169058178.80000001
Top
7 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2005-04-27 12:46:00 得分 0
select 90116.3*1876.0
--结果:169058178.80
哪个结果是正确的?
把我搞蒙了Top
8 楼xcwlbl()回复于 2005-04-27 15:29:37 得分 0
不好意思,原来我把原表的c字段数据类型设成了varchar型,才造成上述误差,不过系统怎会这样呢?Top
9 楼zjcxc(邹建)回复于 2005-04-27 15:33:03 得分 0
数据类型转换的结果如此.Top
10 楼xcwlbl()回复于 2005-04-27 15:47:44 得分 0
假设我真的是要将float转成varvhar型岂不是误差太大?Top




