/**
 * Created by jimiz on 2017/3/28.
 */

var scMathUtil = {
    innerRoundTo: function(num, digit){
        var lFactor = Math.pow(10, digit);
        var fOffSet = 0.5;
        var sign = '';
        if (num < 0){
            sign = '-';
            num = Math.abs(num);
        }
        var result = Math.floor((num / lFactor) + fOffSet).toString();
        var iLength = result.length;
        var r1 = result.substring(0, iLength + digit);
        var r2 = result.substring(iLength + digit, iLength);
        return Number(sign + r1 + '.' + r2);
    },
    floatToBin: function(num) {
        return num.toString(2);
    },
    binToFloat: function(bin) {
        var result = 0;
        var iLength = bin.length;
        var sign = '';
        if (iLength > 0 && bin[0]==='-'){
            sign = '-';
            bin = bin.substring(1, iLength);
        }
        iLength = bin.length;
        var iDot = bin.indexOf('.');
        if (iDot >= 0) {
            for (var i = 0; i < iLength; i++) {
                var num = Number(bin[i]);
                var idx = iDot - i;
                if (idx === 0) {
                    continue
                };
                if (idx > 0) {
                    idx -= 1
                };
                var r = Math.pow(2, idx);
                result += num * r;
            }
        }
        else {
            result = parseInt(bin, 2);
        };
        return sign + result;
    },
    incMantissa: function(bin){
        var result = bin;
        var iDot = bin.indexOf('.');
        if (iDot < 0){return result};
        var iLength = bin.length;
        for (var i = iLength - 1; i > iDot; i--){
            var num = Number(bin[i]);
            if (num === 0){
                num = 1;
                var bin1 = bin.substring(0, i);
                var bin2 = bin.substring(i + 1, iLength);
                result = bin1 + num.toString() + bin2;
                break;
            }

        };
        return result;
    },
    roundTo: function(num, digit){
        var me = this;
        return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
    }
};