JS精确四则运算工具方法

xiaoxiao2021-02-28  74

编写了一个实现任意位数实现连续+、-、*、/单一运算的工具方法,欢迎大家使用还有发现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"));
转载请注明原文地址: https://www.6miu.com/read-33467.html

最新回复(0)