js精確四則運算,js四則運算
由於js的乘除和加減運算有時會出現丟失精度的問題,同時,兩個非數字相加也會出現類型轉換的問題,所以特地寫了一個四則運算的js不丟失精度版來處理js中的四則運算。
/** * 精確加法 * * @param {String | Number} arg1 * @param {String | Number} arg2 * * @returns {number} arg1 + arg2 */ exports.add = function add(arg1, arg2) { // 數字化 var num1 = parseFloat(arg1); var num2 = parseFloat(arg2); var r1, r2, m; try { r1 = num1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = num2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); return (num1 * m + num2 * m) / m; }; /** * 精確減法 * * @param {Number | String} arg1 * @param {Number | String} arg2 * * @returns {number} arg1 - arg2 */ exports.sub = function sub(arg1, arg2) { // 數字化 var num1 = parseFloat(arg1); var num2 = parseFloat(arg2); var r1, r2, m, n; try { r1 = num1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = num2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); return ((num1 * m - num2 * m) / m); }; /** * 精確乘法 * * @param {Number | String} arg1 * @param {Number | String} arg2 * @returns {number} arg1 * arg2s */ exports.mul = function mul(arg1, arg2) { // 數字化 var num1 = parseFloat(arg1); var num2 = parseFloat(arg2); var m = 0, s1 = num1.toString(), s2 = num2.toString(); try { m += s1.split(".")[1].length; } catch (e) { } try { m += s2.split(".")[1].length; } catch (e) { } return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); }; /** * 精確除法 * * @param {Number | String} arg1 * @param {Number | String} arg2 * @returns {number} */ exports.div = function div(arg1, arg2) { // 數字化 var num1 = parseFloat(arg1); var num2 = parseFloat(arg2); var t1 = 0, t2 = 0, r1, r2; try { t1 = num1.toString().split(".")[1].length; } catch (e) { } try { t2 = num2.toString().split(".")[1].length; } catch (e) { } r1 = Number(num1.toString().replace(".", "")); r2 = Number(num2.toString().replace(".", "")); return (r1 / r2) * Math.pow(10, t2 - t1); };
有需要的同學可以自取。
更多內容請查看zakwu的小站