日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js浮点运算式

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js浮点运算式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結果

calc('0.23*-0.03+(4*0.2)') =>0.7931

代碼

//加|減|乘|除 浮點運算 const floatMulti = (a, b) => {let m = 0, s1 = a.toString(), s2 = b.toString(), s1l = s1.split('.')[1], s2l = s2.split('.')[1]m = (s1l ? s1l.length : 0) + (s2l ? s2l.length : 0)return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m) } const floatSub = (a, b) => {let m = 0, s1 = a.toString(), s2 = b.toString(), s1l = s1.split('.')[1], s2l = s2.split('.')[1]m = Math.max((s1l ? s1l.length : 0) ,(s2l ? s2l.length : 0))return(Number(s1)*Math.pow(10, m) - Number(s2)*Math.pow(10, m)) / Math.pow(10, m) } const floatAdd = (a, b) => {let m = 0, s1 = a.toString(), s2 = b.toString(), s1l = s1.split('.')[1], s2l = s2.split('.')[1]m = Math.max((s1l ? s1l.length : 0) ,(s2l ? s2l.length : 0))return (Number(s1)*Math.pow(10, m) + Number(s2)*Math.pow(10, m)) / Math.pow(10, m) } const floatDev = (a, b) => {let m = 0, s1 = a.toString(), s2 = b.toString(), s1l = s1.split('.')[1], s2l = s2.split('.')[1]m = (s1l ? s1l.length : 0) + (s2l ? s2l.length : 0)return (Number(s1.replace('.', '')) / Number(s2.replace('.', ''))) / Math.pow(10, m) } /* * 浮點運算式 * */ export const calc = (() => {//一般的算數表達式即為中綴表達式// let str = "1+((2 + 3 ) * 4 ) - 5 ";//運算符權重const sdw = { '+': 1, '-': 1, '*': 2, '/': 2 };//循環安全數let saveCircle = 137;/***判斷是 運算符|操作數|括號* 【-】字符前面有任何其他運算符則本身被當作數字一部分*@return 1:操作數 2:括號 0:運算符*/const typeChk = (d) => /^-*[\.\d]+$/.test(d) ? 1 : (/[\(\)]/.test(d) ? 2 : 0)/** 操作符操作方法* */const handle = { '+': floatAdd, '-': floatSub, '*': floatMulti, '/': floatDev }/*** 處理輸入* 1) 替換中英括號* 2) 去除空格* 3) 小數點前后非數字,則去除* 3) 小數點之前為空,后面為數字則默認前面添加0* 4) 返回字符分割*/const dealStr = (str) => str//替換左右括號.replace(//, '(').replace(//, ')')//替換空字符.replace(/[^\d\.\(\)\+\*\/-]/g, '')//替換-// .replace(/(\d)-/g,'$1+-')// .replace(/--/g,'+')// .replace(/-\(/g,'-1*(')// .replace(/-/g,'+-1*').match(/(((?<=[^\d])-[\.\d]+)+)|(^-[\.\d]+)|([\d\.]+)|([\(\)\+\*\/-])/g)//中綴表達式轉前綴表達式并計算return (str) => {let operand = [];//操作數棧let operator = [];//操作符棧//去空格(主要是避免數字被空格拆分),分割成數組let arr = dealStr(str);// log(arr)//按照規則入棧let type;for (let i = arr.length - 1, curr; (curr = arr[i]) != null; i--) {type = typeChk(curr);if (type === 1) {operand.push(+curr)} else if (type === 0) {let si = 0, stackTop;while (true && si++ < saveCircle) {stackTop = operator[operator.length - 1];if (stackTop == null || stackTop === ')') {operator.push(curr);break;} else if (sdw[curr] >= sdw[stackTop]) {operator.push(curr);break;} else {operand.push(operator.pop())}}} else {if (curr === ')') {operator.push(curr)}else{let s, si = 0;while (s !== ')' && si++ < saveCircle) {s = operator.pop();if (s === ')') breakoperand.push(s)}}}}//將操作符棧中剩下的彈出壓入操作數棧// operand = [...operand, ...operator.reverse()];// num => ["5", "4", "3", "2", "+", "×", "1", "+", "-"]//"1+((2 + 3 ) × 4 ) - 5 "let prevStack = [...operator, ...operand.reverse()];// ["-", "+", "1", "×", "+", "2", "3", "4", "5"]//計算let resultStack = [], left, right;for (let i = prevStack.length - 1, curr; (curr = prevStack[i]) != null; i--) {if (typeChk(curr)) {//是操作數resultStack.push(curr)} else {//是操作符left = resultStack.pop();right = resultStack.pop();// console.log(left,right,curr)resultStack.push(handle[curr](left, right))}}// log(prevStack);//log(resultStack);return resultStack.length != 1 ? '表達式有誤' : resultStack[0]} })()

總結

以上是生活随笔為你收集整理的js浮点运算式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。