一、问题的由来
今天在用JavaScript实现一个 四则运算的示例的时候,遇到的问题
整体的思路:
利用 prompt 获取到值;和操作符;结合 if else 进行判断
这里有两个坑
1.获取到的值的类型,能否直接进行 运算
2.进行除法运算的精度的问题
代码如下
<script type="text/javascript">
var firstValue = prompt("请输入第一个数:");
var operator = prompt("请输入运算符 (+ - * /)");
var secondValue = prompt("请输入第二个数:");
// 运算之前需要做类型转换
var f = Number(firstValue);
var s = Number(secondValue);
// var f = parseFloat(firstValue);
// var s = parseFloat(secondValue);
document.write(typeof (f));
document.write(typeof (s));
function count() {
if (operator == "+") {
return f + s;
} else if (operator == "-") {
return f - s;
} else if (operator == "*") {
return f * s;
} else if (operator == "/") {
//============================================================================================
// return f / s;
return division(f, s);
//============================================================================================
} else {
// 做异常处理
}
}
function division(arg1, arg2) {
var t1 = 0, t2 = 0, r1, r2;
try {
// 获取小数部分的长度
t1 = arg1.toString().split(".")[1].length;
} catch (e) {
}
try {
// 获取小数部分的长度
t2 = arg2.toString().split(".")[1].length;
} catch (e) {
}
with (Math) {
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return (r1 / r2) * pow(10, t2 - t1);
}
}
document.write("运算的式子是 " + firstValue + " " + operator + " " + secondValue + " = " + count());
</script>
直接使用return f / s; 出现的错误如下
直接返回 0.6/0.2的时候
预计的结果 是 3 但是实际得到的结果是 2.9999999999…
但是 0.6/0.3 的时候可以得到 2
这就涉及到了精度的问题
解决问题的思路
1.分离操作数的 整数部分和小数部分,得到小数部分的长度
2.乘以 10 的次方,是的两个操作数都变成整数
3.相除
这样就可以转换成 整数的相除
这里还有一个疑问
todo…
为什么 0.6/0.2 不正常
但是 0.6/0.3正常。。。。。。。。。
调整 return division(f, s); 之后,解决
JS中with()的用法
with 语句 为一个或一组语句指定默认对象。
用法:with (<对象>) <语句>;
示例
with 语句通常用来缩短特定情形下必须写的代码量。在下面的例子中,请注意 Math 的重复使用:
x = Math.cos(3 * Math.PI) + Math.sin(Math.LN10);
y = Math.tan(14 * Math.E);
当使用 with 语句时,代码变得更短且更易读:
with (Math) {
x = cos(3 * PI) + sin(LN10); y = tan(14 * E); }