JS精确四则运算工具方法

来源:互联网 发布:51单片机蓝牙小车程序 编辑:程序博客网 时间:2024/05/29 07:18

编写了一个实现任意位数实现连续+、-、*、/单一运算的工具方法,欢迎大家使用还有发现bug和优化的地方一定一定在下方评论。

var calculationTools = {    //工具变量    //每个数值的小数位数数组,用于取到小数位数的最大值    bitArr: [],    //小数位数最大值,用于给每个数字取整    maxBit: 0,    //取整后的数组,用于精确地四则运算    intArr: [],    //Math.pow(10,maxBit)不需要解释了吧    roundingNum: 0,    //传入参数的个数,用来在intArr四则运算放大倍数后还原正常值    parameterNum: 0,    //四则运算调用名    //加法     add: function() {        this.init.apply(this, arguments);        return this.calculation("add");    },    //减法       sub: function() {        this.init.apply(this, arguments);        return this.calculation("sub");    },    //乘法       mul: function() {        this.init.apply(this, arguments);        return this.calculation("mul");    },    //除法       div: function() {        this.init.apply(this, arguments);        return this.calculation("div");    },    //下面是定义的工具方法,与四则运算函数的使用无关    //初始化,这里的初始化顺序要注意,一定要根据变量依赖情况按顺序初始化!!!花了我好长时间找bug!!!    init: function() {        this.bitArr = (this.getBitArr).apply(this, arguments);        this.maxBit = (this.getMaxBit).apply(this, arguments);        this.intArr = (this.getIntArr).apply(this, arguments);        this.roundingNum = Math.pow(10, this.maxBit);        this.parameterNum = arguments.length;    },    //返回位数数组,依赖项:无。    getBitArr: function() {        var bitArr = [];        bitArr = [].map.call(arguments, function(item) {            try {                return item.split(".")[1].length;            } catch(e) {                return 0;            }        });        return bitArr;    },    //返回最大位数,依赖项:bitArr。    getMaxBit: function() {        return Math.max.apply(Math, this.bitArr);    },    //返回取整数组,依赖项:maxBit。    getIntArr: function() {        var intArr = [];        var This = this;        intArr = [].map.call(arguments, function(item) {            //由于存在加减法,这里的取整没有采用str.replace(".","")            //而是使用了乘上10的最大位数的次方再取整的方法            return parseInt(item * Math.pow(10, This.maxBit));        });        return intArr;    },    //数组循环计算    calculation: function(flag) {        //把数组第一个值赋给sum        var sum = this.intArr[0];        //从数组第二项开始四则运算        for(var i = 1; i < this.parameterNum; i++) {            if(flag === "add") {                sum += this.intArr[i];            } else if(flag === "sub") {                sum -= this.intArr[i];            } else if(flag === "mul") {                sum *= this.intArr[i];            } else if(flag === "div") {                sum /= this.intArr[i];            }        }        //恢复原始倍数        if(flag === "add") {            //0.1+0.1 = ((0.1*10)+(0.1*10))/10            sum = sum / this.roundingNum;        } else if(flag === "sub") {            //0.1-0.1 = ((0.1*10)-(0.1*10))/10            sum = sum / this.roundingNum;        } else if(flag === "mul") {            //0.1*0.1 = ((0.1*10)*(0.1*10))/(10的平方)            sum = sum / Math.pow(this.roundingNum, this.parameterNum);        } else if(flag === "div") {            //0.1/0.1 = (0.1*10)/(0.1*10)            sum = sum;        }        return sum;    }};console.log(calculationTools.mul("12.12", "10"));console.log(calculationTools.mul("0.1", "0.2", "0.3"));
原创粉丝点击