銀行在線轉賬系統中竟然有這樣的Bug 而長達4年沒有人發現,看看大家能不能找出問題?一天過去了 沒有正解,今天說說正確答案
最近忙于Fix Bug, 在某系統中發現一個Bug,而這個Bug竟然從2004年就存在!! 有這么一個Scenerio:
周期性轉賬,計算需要轉賬次數 eg: 200 每次20 那么 轉賬次數=10 239 每次轉 23.9 轉賬次數=10
代碼1:
代碼2:
這兩段代碼那個正確呢? 大家不要測試,看能不能找出問題?
其實這兩個代碼都是錯誤的。
代碼1不要說,錯到十萬八千里了。對于代碼2,其實在取余運算出現了問題。取余運算前提是這兩個數不是小數(金額都是保留兩位小數)。
只要讓sumTranferAmount*100%pertransferAmount*100 就正確了。
周期性轉賬,計算需要轉賬次數 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))
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++;
}
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 閱讀(2857) 評論(5) 編輯 收藏