CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请教一sql查询数值精度问题!

楼主xcwlbl()2005-04-27 11:54:34 在 MS-SQL Server / 基础类 提问

我有一表   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

相关问题

  • ADO+Access,数值精度问题
  • sql语句:如何查询某列数值(int)按照数值的大小来排列?
  • sql语句:如何查询某列中最大的数值? 100的给
  • 不同数值查询
  • access数据库中sql语句查询中如何将双精度字段转换成(0.000)字符串类型?
  • 在SQL查询语句中如何将数值型int转换为带千分号的varchar型?
  • 关于数值型数据精度的问题
  • 下拉框的数值查询
  • 常量如何取得查询数值!!
  • 如何在sql中设定精度

关键词

  • 误差
  • 电脑
  • sql
  • floatset
  • 精度
  • 结果
  • bselect
  • float
  • 变量
  • 表

得分解答快速导航

  • 帖主:xcwlbl
  • zjcxc
  • xluzhong
  • comerliang

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo