新的起點(diǎn) 新的開(kāi)始

          快樂(lè)生活 !

          銀行在線轉(zhuǎn)賬系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能找出問(wèn)題?一天過(guò)去了 沒(méi)有正解,今天說(shuō)說(shuō)正確答案

                 最近忙于Fix Bug, 在某系統(tǒng)中發(fā)現(xiàn)一個(gè)Bug,而這個(gè)Bug竟然從2004年就存在!! 有這么一個(gè)Scenerio:
           周期性轉(zhuǎn)賬,計(jì)算需要轉(zhuǎn)賬次數(shù) eg: 200 每次20 那么 轉(zhuǎn)賬次數(shù)=10    239 每次轉(zhuǎn) 23.9 
          轉(zhuǎn)賬次數(shù)=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
          ++;
           
                  }

          這兩段代碼那個(gè)正確呢? 大家不要測(cè)試,看能不能找出問(wèn)題?

          其實(shí)這兩個(gè)代碼都是錯(cuò)誤的。
          代碼1不要說(shuō),錯(cuò)到十萬(wàn)八千里了。對(duì)于代碼2,其實(shí)在取余運(yùn)算出現(xiàn)了問(wèn)題。取余運(yùn)算前提是這兩個(gè)數(shù)不是小數(shù)(金額都是保留兩位小數(shù))。
          只要讓sumTranferAmount
          *100%pertransferAmount*100 就正確了。

          posted on 2009-04-10 15:01 advincenting 閱讀(2861) 評(píng)論(5)  編輯  收藏

          評(píng)論

          # re: 一個(gè)在線交易系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能不測(cè)試找出問(wèn)題? 2009-04-10 16:11 lveyo

          JAVA里好像處理金額的計(jì)算最好不要用float,double這樣的簡(jiǎn)單數(shù)據(jù)類(lèi)型  回復(fù)  更多評(píng)論   

          # re: 一個(gè)在線交易系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能不測(cè)試找出問(wèn)題? 2009-04-10 16:13 advincenting

          其實(shí)這兩個(gè)都不對(duì) 呵呵!  回復(fù)  更多評(píng)論   

          # re: 銀行在線轉(zhuǎn)賬系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能找出問(wèn)題? 2009-04-10 23:30 MyYate

          呵呵,第一個(gè)肯定是錯(cuò)的,我看了一下,如果有239元,我每次轉(zhuǎn)238元,應(yīng)該需要轉(zhuǎn)兩次。
          第二個(gè)不清楚,不過(guò)如果我不考慮實(shí)際情況,每次轉(zhuǎn)238.999999元,transactionCount =1,所以也是錯(cuò)的。
          float,double計(jì)算就是這點(diǎn)不好。  回復(fù)  更多評(píng)論   

          # re: 銀行在線轉(zhuǎn)賬系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能找出問(wèn)題? 2009-04-12 11:01 程吉

          不是有可以解決不能精確計(jì)算的float和double類(lèi)型的類(lèi)么???
          不能用?  回復(fù)  更多評(píng)論   

          # re: 銀行在線轉(zhuǎn)賬系統(tǒng)中竟然有這樣的Bug 而長(zhǎng)達(dá)4年沒(méi)有人發(fā)現(xiàn),看看大家能不能找出問(wèn)題?一天過(guò)去了 沒(méi)有正解,今天說(shuō)說(shuō)正確答案 2009-04-15 12:12 origo

          建議采用BigDecimal,或者用Double。在Float之間的除運(yùn)算會(huì)出現(xiàn)差錯(cuò),貌似會(huì)在.000級(jí)別出現(xiàn)誤差。  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁(yè)
        2. 新隨筆
        3. 聯(lián)系
        4. 聚合
        5. 管理
        6. <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(13)

          隨筆分類(lèi)(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類(lèi)

          IT人的英語(yǔ)學(xué)習(xí)網(wǎng)站

          JAVA站點(diǎn)

          優(yōu)秀個(gè)人博客鏈接

          官網(wǎng)學(xué)習(xí)站點(diǎn)

          生活工作站點(diǎn)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 盐城市| 宜昌市| 万山特区| 石首市| 南充市| 麻城市| 清新县| 东乌珠穆沁旗| 星座| 昌都县| 玉溪市| 综艺| 曲沃县| 宝清县| 祁阳县| 阆中市| 宜阳县| 罗定市| 佳木斯市| 寻乌县| 北京市| 磐石市| 元氏县| 深泽县| 新化县| 乐昌市| 锡林郭勒盟| 浮梁县| 本溪市| 三原县| 宜州市| 上虞市| 天水市| 营山县| 白城市| 济阳县| 云浮市| 龙川县| 玛纳斯县| 文成县| 远安县|