[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;
}
~~~