[TOC]
## 小数求和
问题描述:
js 控制台直接输入 0.1 + 0.2 求和值,结果不等于0.3
> tips: 计算机在进行十进制的数字运算时,会将数字先转换为对应的二进制,然后对阶运算,最后再将结果转为十进制数。在转换、对阶过程中就可能产生精度丢失问题。。。
解决思路:
1.小数转为整数再进行计算,但是这不是最优解。
~~~
function add (number1, number2) {
const suffixLength1 = number1.toString().split(".")[1].length;
const suffixLength2 = number2.toString().split(".")[1].length;
const baseNum = Math.pow(10, Math.max(suffixLength1, suffixLength2));
return (baseNum * number1 + baseNum * number2) / baseNum;
}
~~~
2.引用第三方库,例如:[mathjs](https://github.com/josdejong/mathjs)
## 数据深拷贝
问题描述:
对象复制时,修改复制后的对象,被复制着也会被修改,这也被称为浅拷贝。
解决思路:
判断传入的对象的数据类型,数组和对象遍历其,将他们的值拷贝给新的对象并返回结果。
~~~
function deepClone(obj) {
let newObj = null;
if (Array.isArray(obj)) {
newObj = obj.map(item => deepClone(item));
} else if (Object.prototype.toString.call(obj) === "[object Object]") {
newObj = {};
for (let key in obj) {
newObj[key] = deepClone(obj[key]);
}
} else {
newObj = obj;
}
return newObj;
}
~~~