2015年5月16日 星期六

函數(_bankerRound):四捨六入五成雙

MultiCharts 內建函數的 Round 是大家所熟知的四捨五入去到小數點以下幾位。但是,Round 這個幾乎所有程式語言都有的內建函數,卻不見得在每個語言中都是四捨五入喔。至於,什麼是"四捨六入五成雙"?可以查一下 banker's rounding。這裡有些不同 round 方式的介紹:http://goo.gl/gTpp9b

這一篇文章要介紹的是,在 MultiCharts 搞出 "四捨六入五成雙" 的 Round函數,內容我就不多做介紹了,請自行研究程式碼,函數名稱: _bankerRound。
input: value(Numeric), digit(Numeric);
var:step1(0),step2(0),step3(0);


step1= value * Power(10, digit+1);
step2= absvalue( Mod(IntPortion(step1), 10) );


if step2>5 or (step2=5 and Mod(IntPortion(value*power(10,digit)),2)<>0) then
    step3 = IntPortion(absvalue(value)*power(10,digit)+1) / power(10,digit);

if step2<5 or (step2=5 and Mod(IntPortion(value*power(10,digit)),2)=0) then
    step3 = IntPortion(absvalue(value)*power(10,digit)+0) / power(10,digit);

    
_bankerRound= iff(value<0, -1, 1) * step3;




那麼,我們就用 print 來看一下它的效果,請自行體會吧。