新的起点 新的开始

快乐生活 !

银行在线转账系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能找出问题?一天过去了 没有正解,今天说说正确答案

       最近忙于Fix Bug, 在某系统中发现一个Bug,而这个Bug竟然从2004年就存在!! 有这么一个Scenerio:
 周期性转账,计算需要转账次数 eg: 200 每次20 那么 转账次数=10    239 每次转 23.9 
转账次数=10

代码1:

float  sumTranferAmount;
float  perTransferAmount;
transactionCount = (int)Math.ceil((Math.round((sumTRanferAmount/perTransferAmount)*100.0/ 100.0))

代码2:

        float sumTranferAmount;
        
float perTransferAmount;
        
int transactionCount = (int)(sumTranferAmount / perTransferAmount);
        
if ( (sumTranferAmount%  (perTransferAmount!= 0){
            transactionCount
++;
 
        }

这两段代码那个正确呢? 大家不要测试,看能不能找出问题?

其实这两个代码都是错误的。
代码1不要说,错到十万八千里了。对于代码2,其实在取余运算出现了问题。取余运算前提是这两个数不是小数(金额都是保留两位小数)。
只要让sumTranferAmount
*100%pertransferAmount*100 就正确了。

posted on 2009-04-10 15:01 advincenting 阅读(2850) 评论(5)  编辑  收藏

评论

# re: 一个在线交易系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能不测试找出问题? 2009-04-10 16:11 lveyo

JAVA里好像处理金额的计算最好不要用float,double这样的简单数据类型  回复  更多评论   

# re: 一个在线交易系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能不测试找出问题? 2009-04-10 16:13 advincenting

其实这两个都不对 呵呵!  回复  更多评论   

# re: 银行在线转账系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能找出问题? 2009-04-10 23:30 MyYate

呵呵,第一个肯定是错的,我看了一下,如果有239元,我每次转238元,应该需要转两次。
第二个不清楚,不过如果我不考虑实际情况,每次转238.999999元,transactionCount =1,所以也是错的。
float,double计算就是这点不好。  回复  更多评论   

# re: 银行在线转账系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能找出问题? 2009-04-12 11:01 程吉

不是有可以解决不能精确计算的float和double类型的类么???
不能用?  回复  更多评论   

# re: 银行在线转账系统中竟然有这样的Bug 而长达4年没有人发现,看看大家能不能找出问题?一天过去了 没有正解,今天说说正确答案 2009-04-15 12:12 origo

建议采用BigDecimal,或者用Double。在Float之间的除运算会出现差错,貌似会在.000级别出现误差。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

Locations of visitors to this page

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(13)

随笔分类(71)

随笔档案(179)

文章档案(13)

新闻分类

IT人的英语学习网站

JAVA站点

优秀个人博客链接

官网学习站点

生活工作站点

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜