DB2 V8 decimal除法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HYPERLINK /dlodj/article/details/7060891 关于DB2除法的小数位问题 分类: HYPERLINK /DLODJ/article/category/861126 DB2 2011-12-11 12:46 70人阅读 HYPERLINK /dlodj/article/details/7060891 \l comments 评论(0) HYPERLINK javascript:void(0); \o 收藏 收藏 HYPERLINK /dlodj/article/details/7060891 \l report \o 举报 举报 今天在做db2测试的时候发现一个问题:select 1/3 from sysibm.sysdummy1;???? 结果得到: 0!!!!郁闷,怎么会这样。后来仔细查了一下db2的资料,发现db2的算术运算是遵循一下规则:argument1??????????????? argument2???????????? ? result decimal(a,b)?????????????decimal(c,d)????????????decimal(p,s)p=MAX( max(b,d) +? max(a-b,c-d)s=MAX(b,d)但除法的小数位计算遵循下面规则: 31-p+s-s(其中p为被除数的精度,s为被除数的小数位,s为除数的小数位)举例来讲:1/3 由于,由于两者数据类型皆为int,所以结果也为int 即结果为0?1.0/3,由于1.0为小数,按照小数除法的规则,describe select 1.0 from sysibm.sysdummy1;? (2,1) describe select 3 from sysibm.sysdummy1;???? (4,0) 31-2+1-0=31-1=3031-2+1=30,故此保留30位小数。select 1.0/3 from sysibm.sysdummy1;结果为:--- 0.333333333333333333333333333333?1/3.0,由于1为int,3.0为小数describe select 1 from sysibm.sysdummy1;? (4)---4个字节,共占10位,其中符号位一位,共11位 describe select 3.0 from sysibm.sysdummy1;???? (2,1) 31-11+0-1=31-12=19,故此保留19位小数。select 1/3.0 from sysibm.sysdummy1;结果为:---0.3333333333333333333?另外,如果你的db2没有设置过的话,运行一下语句可能会出错:select DEC(1,31,0)/DEC(1,31,5) from sysibm.sysdummy1;? 报错说除法运算无效。其实原因就是小数位的问题,按照31-p+s-s的算法,31-31+0-5=-5,也即小数位数为-5,小数位又怎么能是负值呢?所以就报错了。此时需要设置一个参数:MIN_DEC_DIV_3.?? 执行以下语句即可DB2 UPDATE DB CFG FOR db_name USING MIN_DEC_DIV_3 YES即将MIN_DEC_DIV_3的值设置为YES,意思是小数位数取3和按照31-p+s-s 计算出的小数位两者的较大值。即是说最小也有3位小数,这样自然就不会再报错了。需要注意的是,虽然可以使用db2 update db cfg 命令来设置MIN_DEC_DIV_3这个参数,但是实际上这个参数在db cfg 中是不可见的。也就是说不要指望使用db2 get db cfg for db_name 可以找到它,这是一个隐藏的参数(搞不懂db2是什么用意。。。。。。)。?从db2v7版本以上又引入了一个DB2_MIN_DEC_DIV_6这么一个参数,可以将小数位至少保存6位,如果MIN_DEC_DIV_3和DB2_MIN_DEC_DIV_6同时为YES,则DB2_MIN_DEC_DIV_6覆盖MIN_DEC_DIV_3。DB2_MIN_DEC_DIV_6这个参数可以使用db2set 来设置:语句为db2set DB2_MIN_DEC_DIV_6=YES?? 可以使用DB2SET -ALL 来查看设完需要重启db2。(PS:我使用的是db2 V9.5,服务器为AIX,在我自己的平台上测试MIN_DEC_DIV_3是可以的,但是无论我把DB2_MIN_DEC_DIV_6设置为YES或者NO,都没看出有什么效果,不知道是我的设置方法不对还是怎么回事。)?如果想要最初的语句1/3得到非零值。可以使用如下方法:(1) selec

文档评论(0)

me54545 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档