社区
DB2
帖子详情
急:DB2 Decimal update时精度出现问题
sTigerwsk
2009-10-20 07:49:22
我有一张数据库表,表中有字段 aaa decimal(17,2).
在使用过程中出现如下问题:
在给字段赋值433.36后,打日志得到值是433.36。
在数据库update后,打日志得到值为433.35。
中间未做任何处理。
请问有何办法可以避免此类问题?
数据库版本为:DB2 9.5,程序为Proc的程序。
PS:该问题不是经常出现,在更新数据库100次后可能会出现一次。
...全文
1466
18
打赏
收藏
急:DB2 Decimal update时精度出现问题
我有一张数据库表,表中有字段 aaa decimal(17,2). 在使用过程中出现如下问题: 在给字段赋值433.36后,打日志得到值是433.36。 在数据库update后,打日志得到值为433.35。 中间未做任何处理。 请问有何办法可以避免此类问题? 数据库版本为:DB2 9.5,程序为Proc的程序。 PS:该问题不是经常出现,在更新数据库100次后可能会出现一次。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sTigerwsk
2010-01-01
打赏
举报
回复
DB2V9.7版本中不再会出现该问题……
据IBM人士解释……
sTigerwsk
2009-11-16
打赏
举报
回复
再次研究了一下,发现如果将一个C中的double类型不做四舍五入处理,直接交给数据库,多次更新后会出现精度问题……
今天又出了一个怪问题,0.01直接更新之后变成0了……
sTigerwsk
2009-11-03
打赏
举报
回复
DB2的对应字段直接建成double型字段?然后设置精度?
leonjava
2009-10-28
打赏
举报
回复
之前也遇到类似情况
把 DOUBLE 的精度加长 变为3位搞定
johdan_honey
2009-10-24
打赏
举报
回复
建议你把日志打印的数据的精度提高,按照你的情况必然是因为还有第三位小数造成的
ACMAIN_CHM
2009-10-23
打赏
举报
回复
[Quote]而且见到过db2插值进去后,值会变成一个高精度近似数,比如,2.13,插进去有可能会变成2.1299999999[/Quote]
首先我们先达成共识, 计算机中无法用8或或N个字节表示某个区间内所有的实数 . 而 2.13 你可以试着把它转换成 2进制。
所以在计算中如果有double的小数,会有误差。
但 decimal 本身应该没有, 所以需要看你是如何插入这个小数的,当然也要看你对这个字段的定义是什么? 是 deciaml(, 还是double 这也是为会要检查你的表结构。
sTigerwsk
2009-10-23
打赏
举报
回复
上面说的那种情况是不指定decimal的精度有可能会出现。
sTigerwsk
2009-10-23
打赏
举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]
应该不是BUG,
建议贴出来你的表结构,以及你的插入语句。你的db2版一,这样其它人也可以试一下。
[/Quote]
大哥,这个跟表结构貌似没有关系。我的db2版本是9.5,这个问题在8系统列的版本上也出现过。
类似问题有人在chinaunix也发帖询问了。
而且见到过db2插值进去后,值会变成一个高精度近似数,比如,2.13,插进去有可能会变成2.1299999999
sTigerwsk
2009-10-23
打赏
举报
回复
[Quote=引用 4 楼 mr_bean 的回复:]
数据库一直都有类似问题 但是我碰到的只是存储奇数尾数才会出 现在能缓解方法是decimal转为double
[/Quote]
原来使用oracle数据库,没有发现类似问题,也可能是较少使用奇数尾数。
WWWWA
2009-10-23
打赏
举报
回复
用DOUBLE类型试试,如果没有问题,则是decimal的问题
sTigerwsk
2009-10-23
打赏
举报
回复
[Quote=引用 2 楼 wwwwa 的回复:]
直接赋值没有经过计算,应该是BUG吧
[/Quote]
有经过一个计算,一个简单的减法计算。
原decimal字段的值是555988.36, 然后减去555555, 得到433.36,此处第一次打日志,打出来的日志为433.36。
然后进行update操作,操作前打日志,433.36,操作后需要查询结果插入别一张表中,查询后打日志,433.35……
且这个问题出现的频率确实不是很高,很偶然的出现……
精度?类型转换?decimal与double的差别?
sTigerwsk
2009-10-23
打赏
举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]
应该不是BUG,
建议贴出来你的表结构,以及你的插入语句。你的db2版一,这样其它人也可以试一下。
[/Quote]
这个跟表结构没有什么关系。
我用的是类似于insert into aaa (aa, bb, cc) values(11,22,33);
update时采用的是用游标打开获取当前记录,然后update current cursor的方式去更新。
很怀疑是proc的double与decimal的转换……
sTigerwsk
2009-10-23
打赏
举报
回复
在proc中连接两次打印出来的值都是对的,然后经过一次update操作后,再从数据库读出来,打日志值就差了0.01.
这个如果说proc的问题也是bd2,proc的问题吧,在oracle下没有遇到过这样的问题。
初步怀疑与decimal的存储方式有关。
Liyingyue_FFS
2009-10-23
打赏
举报
回复
[Quote=引用 12 楼 acmain_chm 的回复:]
引用而且见到过db2插值进去后,值会变成一个高精度近似数,比如,2.13,插进去有可能会变成2.1299999999
首先我们先达成共识, 计算机中无法用8或或N个字节表示某个区间内所有的实数 . 而 2.13 你可以试着把它转换成 2进制。
所以在计算中如果有double的小数,会有误差。
但 decimal 本身应该没有, 所以需要看你是如何插入这个小数的,当然也要看你对这个字段的定义是什么? 是 deciaml(, 还是double 这也是为会要检查你的表结构。
[/Quote]
计算机中所有数据的存储都是2进制的,但是大多数小数部分存储时只能用一个指定长度范围内的近似的2进制序列来存储。因此,数据库存储的大多数小数数据只是我们所期望的值的近似值然后通过某种规则(四舍五入到某一位)来显示出我们需要的值。
这两个数据中存在某种误差,而你UPDATE操作的对象是数据库物理存储的数据,这样,在经历100次UPDATE之后,这个误差就可能由量变引起质变。
ACMAIN_CHM
2009-10-21
打赏
举报
回复
应该不是BUG,
建议贴出来你的表结构,以及你的插入语句。你的db2版一,这样其它人也可以试一下。
WWWWA
2009-10-21
打赏
举报
回复
直接赋值没有经过计算,应该是BUG吧
liyan93834183
2009-10-21
打赏
举报
回复
你应该先确定是不是proc的问题,如果真有这个问题,那你发现了一个DB2的bug啊,呵呵
Mr_Bean
2009-10-21
打赏
举报
回复
数据库一直都有类似问题 但是我碰到的只是存储奇数尾数才会出 现在能缓解方法是decimal转为double
关于
DB2
除法的小数位
问题
今天在做
db2
测试的
时
候发现一个
问题
: select 1/3 from sysibm.sysdummy1; 结果得到: 0!!!!郁闷,怎么会这样。 后来仔细查了一下
db2
的资料,发现
db2
的算术运算是遵循一下规则: argument1 argument2 result
decimal
(a,b)
关于
DB2
除法的小数位
问题
.
今天在做
db2
测试的
时
候发现一个
问题
: select 1/3 from sysibm.sysdummy1; 结果得到: 0!!!!郁闷,怎么会这样。 后来仔细查了一下
db2
的资料,发现
db2
的算术运算是遵循一下规则: argument1 argument2 result
decimal
(a,b) ...
DB2
-数字运算保留位数
问题
DB2
中除法的小数位数遵循下面规则: 31-p+s1-s2(其中p为被除数的
精度
,s1为被除数的小数位,s2为除数的小数位) describe select 1.0 from sysibm.sysdummy1; SQLTYPE
DECIMAL
精度
(2,1) describe select 1 from sysibm.sysdummy1; SQLTYPE INTEGER
精度
(
关于修改
DB2
数据库中字段类型
之前用
DB2
创建表示其中有一个金额字段用的varchar类型,导致在生产
时
用户做交易将该字段存储到数据库中
时
出现
千分符(1,000)这种格式,然后查询
时
就会报错。 修复方案: 修改该字段类型为
decimal
类型保留小数点2位。(表名tablename 旧列 LIMIT 新列 LIMIT1) 第一步:在这个表中创建一个新的列 alter table tablename add colum
oracle除法得到小数,关于
DB2
除法的小数位
问题
.
今天在做
db2
测试的
时
候发现一个
问题
:select 1/3 from sysibm.sysdummy1;结果得到: 0!!!!郁闷,怎么会这样。后来仔细查了一下
db2
的资料,发现
db2
的算术运算是遵循一下规则:argument1 argument2 result
decimal
(a,b)
decimal
(c,d)...
DB2
5,888
社区成员
11,654
社区内容
发帖
与我相关
我的任务
DB2
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
复制链接
扫一扫
分享
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章