js小数精确计算

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 04:04   11   0
/**
     * 计算
     */
var count={
    jisuan: function () {
        var th = this;
        var type = arguments[0];
        var arg = arguments;
        var result = 0;
        switch (type) {
            case '+':
                result = th.xiangjia(arg);
                break;
            case '-':
                result = th.xiangjian(arg);
                break;
            case '*':
                result = th.chengfa(arg);
                break;
            case '/':
                result = th.chufa(arg);
                break;
        }
        return result
    },
    quzheng: function (param) {
        var args = param + '';
        var index = args.indexOf('.');
        var doubleLen = 0;
        if (index > 0) {
            doubleLen = args
                .substring(index + 1)
                .length
            param = param * 1 * Math.pow(10, doubleLen);
        }
        var p = [0, 0];
        var i = (param + '').indexOf('.');
        param = Math.round(param); //取最接近整数
        p.splice(0, 1, param);
        p.splice(1, 1, doubleLen);
        return p
    },
    //加法,减法,除法,计算比较麻烦,需要取到小数位数最大的值
    xiangjia: function (args) {
        var th = this;
        var con = 0,
            len = [],
            i,
            argLen = args.length,
            arg;
        for (i = 0; i < argLen; i++) {
            if (i > 0) {
                len[i - 1] = th.quzheng(args[i])[1];
            }
        }
        var maxLen = Math
            .max
            .apply(null, len);
        for (i = 0; i < argLen; i++) {
            if (i > 0) {
                con += th.quzheng(args[i])[0] * 1 * Math.pow(10, (maxLen - len[i - 1]));
            }
        }
        return con / Math.pow(10, maxLen)
    },
    // 减法
    xiangjian: function (args) {
        var th = this,
            con = 0,
            len = [],
            i,
            argLen = args.length,
            arg;
        for (i = 0; i < argLen; i++) {
            if (i > 0) {
                len[i - 1] = th.quzheng(args[i])[1];
            }
        }
        var maxLen = Math
            .max
            .apply(null, len);
        con = th.quzheng(args[1])[0] * 1 * Math.pow(10, (maxLen - len[0]));
        for (i = 0; i < argLen; i++) {
            if (i > 1) {
                con = con * 1 - (th.quzheng(args[i])[0] * 1 * Math.pow(10, (maxLen - len[i - 1]))) * 1;
            }
        }
        return con / Math.pow(10, maxLen)
    },
    //乘法需要求到所有取正的倍数
    chengfa: function (args) {
        var th = this,
            con = 1,
            len = 0,
            i,
            argLen = args.length,
            arg;
        for (i = 0; i < argLen; i++) {
            if (i > 0) {
                arg = th.quzheng(args[i])
                con = arg[0] * 1 * con;
                len += arg[1];
            }
        }
        return con / Math.pow(10, len)
    },
    //除法需要求最长小数位数
    chufa: function (args) {
        var th = this,
            con = 1,
            len = [],
            i,
            argLen = args.length,
            arg;
        for (i = 0; i < argLen; i++) {
            if (i > 0) {
                len[i - 1] = th.quzheng(args[i])[1];
            }
        }
        var maxLen = Math
            .max
            .apply(null, len);
        con = th.quzheng(args[1])[0] * 1 * Math.pow(10, (maxLen - len[0]));
        for (i = 0; i < argLen; i++) {
            if (i > 1) {
                con = con * 1 / (th.quzheng(args[i])[0] * 1 * Math.pow(10, (maxLen - len[i - 1]))) * 1;
            }
        }
        return con
    },
}调用方式 count.jisuan('+',0.1,0.2)
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP