首页 > 编程知识 正文

jsp实现加减乘除(算术表达式实现加减乘除)

时间:2023-05-04 14:48:37 阅读:97078 作者:3654

去我主页看更多JS分享!

这是另一种实现方式,更加简洁和完整(之前有一个实现,所以您可以比较这个实现的代码)

一般涉及到价格的计算,比如商场的订单结算,大部分都是后端计算。

不过也会有前台的参与,不要慌。下面的代码直接解决了js的计算问题。

如果你有任何问题,请在评论区告诉我们。如果没有,就夸我们一句!

一、加法、减法

1.错误示例

console . log(0.1 0.2);

//输出:0.30000000000000004,正确结果为0.3。

console.log(0.2 0.4)

//输出:0.6000000000000001,正确结果为0.6。

console . log(1.0-0.9);

//输出:0.09999999999999998,正确结果为0.1。

console . log(0.9-0.7);

//输出:0.2000000000000000007,正确结果为0.2。

2.分析

产生错误的原因是,在操作浮点数时,先将其转换为二进制,再由二进制计算,然后将结果转回十进制。简单理解js中的非整数运算会出错,下面是解决代码(建议所有非整数运算都要处理,不要直接计算)。

//加法运算

var calcPlus=(num1,num 2)={ 0

设l1、l2、m;

尝试{

l1=num1.toString()。拆分('.')[1].长度;

抓住

L1=0;

}

尝试{

l2=num2.toString()。拆分('.')[1].长度;

抓住

L2=0;

}

m=Math.pow(10,Math.max(l1,L2));

返回(num 1 * m num 2 * m)/m;

};

console.log(calcPlus(0.1,0.2));

//输出:0.3

console.log(calcPlus(0.2,0.4));

//输出:0.6

//减法运算

var calcSubtract=(num1,num 2)={ 0

设l1、l2、m;

尝试{

l1=num1.toString()。拆分('.')[1].长度;

抓住

L1=0;

}

尝试{

l2=num2.toString()。拆分('.')[1].长度;

抓住

L2=0;

}

m=Math.pow(10,Math.max(l1,L2));

返回(num 1 * m-num 2 * m)/m;

};

console.log(calcSubtract(1.0,0.9));

//输出:0.1

console.log(calcSubtract(0.9,0.7));

//输出:0.2

对比这两个代码,可以发现实现原理是一样的:

得到中间值,即两个数的最大小数位数,从10的幂转换为实际值;最后通过中间值将数字1和数字2变成整数,再通过计算后的中间值得到正确的结果。例如,0.1 0.2=(0.1 X10 0.2 X10)/10=3/10=0.3;例如,0.9-0.7=(0.9x 10-0.7x 10)/10=2/10=0.2

二、乘法

1。错误示例

console . log(19.9 * 100);

//输出:19899998,正确结果是1990 . 999999999996

console . log(79.9 * 100);

//输出:7990.000000001,正确结果为7990。

2.分析

错误的原因是它被转换成二进制,然后被计算。首先粘贴代码:

//乘法运算

var calcmmultiply=(num 1,num 2)={ 0

设m=0;

尝试{

m=num1.toString()。拆分('.')[1].长度;

}捕获(e) {}

尝试{

m=num2.toString()。拆分('.')[1].长度;

}捕获(e) {}

return()num 1 . ToString()。替换('.',' '))* Number(num2.toString()。替换('.',' ')))/Math.pow(10,m);

};

console . log(calcmmultiply(19.9,100));

//输出:1990年

console.log(calcMultiply(79.9,100));

//输出:7990

实施原则:

中间值是两个数小数位数之和,由10的幂转换为实际值;从数字1和数字2中去掉小数点,即它们变成整数,再除以乘法。

以中间值,得到正确的结果;比如:19.9 * 100 => (199 * 100) / 10 = 19900 / 10 = 1990

三、除法

1. 出错的例子

console.log(6.6 / 0.2); //输出:32.99999999999999,正确结果为33 console.log(99.9 / 3); //输出:33.300000000000004,正确结果为33.3

2. 解析

出错的原因,一样是转为二进制后再进行计算。先贴上代码:

//除法运算 var calcDivide = (num1, num2) => { let l1 = 0, l2 = 0; try { l1 = num1.toString().split(".")[1].length; } catch (e) {} try { l2 = num2.toString().split(".")[1].length; } catch (e) {} let c = Number(num1.toString().replace(".", "")) / Number(num2.toString().replace(".", "")); return calcMultiply(c , Math.pow(10, l2-l1)); }; console.log(calcDivide (6.6, 0.2)); //输出:33 console.log(calcDivide (99.9, 0.3)); //输出:333

实现原理:

得到中间值,是两个数字的小数位之差,并由10的次方转换为实际的值;注意除法的除数位与被除数位是固定的,因此上面代码是l2-l1;将数字1、数字2去除小数点,即变为整数,相除后乘以中间值(调用上面的乘法的计算,因为会存在小数),得到正确的结果;比如:99.9/3 => (999 / 3) * 0.1 = 333 * 0.1 = 33.3

四、拓展封装(完整代码)

上面的代码还有重复的地方,那就再进一步封装:

/** * calc.plus 加法运算 * calc.subtract 减法运算 * calc.multiply 乘法运算 * calc.divide 除法运算 */ var calc = (function () { let operation = (num1, num2, op) => { let l1, l2, max; try { l1 = num1.toString().split(".")[1].length; } catch (e) { l1 = 0; } try { l2 = num2.toString().split(".")[1].length; } catch (e) { l2 = 0; } switch (op) { case "plus": max = Math.pow(10, Math.max(l1, l2)); return (num1 * max + num2 * max) / max; case "subtract": max = Math.pow(10, Math.max(l1, l2)); return (num1 * max - num2 * max) / max; case "multiply": return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", ""))) / Math.pow(10, l1 + l2); case "divide": return operation(Number(num1.toString().replace(".", "")) / Number(num2.toString().replace(".", "")), Math.pow(10, l2 - l1), "multiply"); } }; let plus = (a, b) => { return operation(a, b, "plus"); }; let subtract = (a, b) => { return operation(a, b, "subtract"); }; let multiply = (a, b) => { return operation(a, b, "multiply"); }; let divide = (a, b) => { return operation(a, b, "divide"); }; return { plus, subtract, multiply, divide }; })(); console.log(0.1 + 0.2, calc.plus(0.1, 0.2)); //输出:0.30000000000000004 0.3 console.log(0.2 + 0.4, calc.plus(0.2, 0.4)); //输出:0.6000000000000001 0.6 console.log(1.0 - 0.9, calc.subtract(1.0, 0.9)); //输出:0.09999999999999998 0.1 console.log(0.9 - 0.7, calc.subtract(0.9, 0.7)); //输出:0.20000000000000007 0.2 console.log(19.9 * 100, calc.multiply(19.9, 100)); //输出:1989.9999999999998 1990 console.log(79.9 * 100, calc.multiply(79.9, 100)); //输出:7990.000000000001 7990 console.log(6.6 / 0.2, calc.divide(6.6, 0.2)); //输出:32.99999999999999 33 console.log(99.9 / 3, calc.divide(99.9, 3)); //输出:33.300000000000004 33.3

如果问题,请在评论区留言!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。