摘要:常用計算由于存在計算精度的問題,例如,所以需要整理以下方法,方便進行簡單計算。主要思路是先轉(zhuǎn)成整數(shù),然后再進行計算,計算完再轉(zhuǎn)回浮點數(shù)獲取小數(shù)位以及向右移動小數(shù)位,是計算時轉(zhuǎn)換成整數(shù)的工具函數(shù)。
js 常用計算
由于存在計算精度的問題,例如 0.1+0.2 = 0.30000000000000004,所以需要整理以下方法,方便進行簡單計算。
主要思路是先轉(zhuǎn)成整數(shù),然后再進行計算,計算完再轉(zhuǎn)回浮點數(shù)
獲取小數(shù)位以及向右移動小數(shù)位,是計算時轉(zhuǎn)換成整數(shù)的工具函數(shù)。加減乘除四個函數(shù)都用到了獲取小數(shù)位
// 獲取小數(shù)位 export function getDecimalPlace(num) { try { let result = num.toString().split(".")[1].length; return result; } catch (e) { return 0; } }向右移動小數(shù)位
/** * 向右移動小數(shù)點 * @param movePlace 移動步數(shù),正向右,負(fù)數(shù)向左 */ export function moveDecimalPlace(num, movePlace) { let decimalPlace = getDecimalPlace(num); let step = movePlace - decimalPlace; // 先轉(zhuǎn)成整數(shù)類型,再確定需要如何移動,為了處理 268.34*100 卻等于 26833.999999999996 的問題 let intNum = Number(num.toString().replace(".", "")); if (step > 0) { return intNum * Math.pow(10, step); } else if (step < 0) { return intNum / Math.pow(10, -step); } else { return intNum; } }
這里右移動小數(shù)點需要先轉(zhuǎn)成整形,再進一步處理是因為存在一些浮點數(shù)乘以 10 的倍數(shù)也會出問題!加法
例如: 268.34*100 => 26833.999999999996
/** * 相加 arg1 + arg2 */ export function add(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); return (arg1 + arg2) / Math.pow(10, maxStep); }減法
/** * 相減 arg1 - arg2 */ export function sub(arg1, arg2) { return add(arg1, -arg2); }乘法
/** * 乘法 arg1 * arg2 */ export function multiply(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); if (maxStep > 0) { let stepPow = Math.pow(10, maxStep); return (arg1 * arg2) / (stepPow * stepPow); } return arg1 * arg2; }除法
/** * 除法 arg1 / arg2 */ export function division(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); return arg1 / arg2; }其他
源碼鏈接
更多代碼片段
個人博客鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/100253.html
摘要:實例一已知日期格式為,計算相對于今天的天數(shù)差。在實踐應(yīng)用中,還會有各種各樣的關(guān)于時間操作的需求,歡迎補充,我都將一一解答。 實例 一:已知日期格式為 YYYY/MM/DD,計算相對于今天的天數(shù)差。 function fromNow(date){ var mTimes = new Date(date); var fromTimes = Date.now() - mTime...
摘要:供用戶在相應(yīng)的階段對其進行操作。我們像下面這樣使用這個指令大多數(shù)情況下,我們只需要使用與鉤子函數(shù)。里提供了函數(shù)的簡寫形式鉤子函數(shù)有兩個常用的參數(shù)和。其他用法與全局自定義指令一致。 一、vue生命周期 vue實例從創(chuàng)建到銷毀的過程,稱為生命周期,共有八個階段。 這八個階段里分別有一個叫做鉤子函數(shù)的實例選項。供用戶在相應(yīng)的階段對其進行操作。 beforeCreate(){ //組件實例剛...
摘要:供用戶在相應(yīng)的階段對其進行操作。我們像下面這樣使用這個指令大多數(shù)情況下,我們只需要使用與鉤子函數(shù)。里提供了函數(shù)的簡寫形式鉤子函數(shù)有兩個常用的參數(shù)和。其他用法與全局自定義指令一致。 一、vue生命周期 vue實例從創(chuàng)建到銷毀的過程,稱為生命周期,共有八個階段。 這八個階段里分別有一個叫做鉤子函數(shù)的實例選項。供用戶在相應(yīng)的階段對其進行操作。 beforeCreate(){ //組件實例剛...
摘要:供用戶在相應(yīng)的階段對其進行操作。我們像下面這樣使用這個指令大多數(shù)情況下,我們只需要使用與鉤子函數(shù)。里提供了函數(shù)的簡寫形式鉤子函數(shù)有兩個常用的參數(shù)和。其他用法與全局自定義指令一致。 一、vue生命周期 vue實例從創(chuàng)建到銷毀的過程,稱為生命周期,共有八個階段。 這八個階段里分別有一個叫做鉤子函數(shù)的實例選項。供用戶在相應(yīng)的階段對其進行操作。 beforeCreate(){ //組件實例剛...
閱讀 2345·2023-04-25 14:50
閱讀 1410·2021-10-13 09:50
閱讀 1933·2019-08-30 15:56
閱讀 1909·2019-08-29 15:29
閱讀 2949·2019-08-29 15:27
閱讀 3634·2019-08-29 15:14
閱讀 1253·2019-08-29 13:01
閱讀 3351·2019-08-26 14:06