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]}
})()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

悬浮球多功能_一个悬浮球,怎么可以这么贴心~

原标题&#xff1a;一个悬浮球&#xff0c;怎么可以这么贴心~一个悬浮球 满足你N个愿望※ 专题&#xff5c;图文&#xff5c;悬浮球上手指南这个小蛋蛋是不少小朋友喜爱的零食&#xff0c;因为它能满足小朋友好几个愿望&#xff0c;能吃又能玩的零食哪个小朋友会不喜欢&#xf…

python 字典添加元素乱序了_Python有序字典的两个小“惊喜”

从 Python 3.6 开始&#xff0c;常规的字典会记住其插入的顺序&#xff1a;就是说&#xff0c;当遍历字典时&#xff0c;你获得字典中元素的顺序跟它们插入时的顺序相同。在 3.6 之前&#xff0c;字典是无序的&#xff1a;遍历顺序是随机的。关于有序字典&#xff0c;这里有两件…

el-table跨页选中

以id作为唯一标识 模板 <el-table :data"data" ref"table"select-all"selectAll"select"select"style"width:100%"><el-table-column type"selection"></el-table-column><el-table-colum…

bsc是指什么_为什么KPI令人厌恶?中小企业不要乱用KPI!

私信小编“绩效”两字&#xff0c;免费发送60分钟薪酬绩效管理内部培训视频。导读现在很多的企业都会对员工做一些绩效考核&#xff0c;大多数还是采用KPI的方式。但是员工对KPI的考核越来越反感&#xff0c;甚至出现抵触的情况。为什么会出现这种想象呢&#xff1f;其实很简单…

js原生popup_JavaScript的popup框

确认框用于使用户可以验证或者接受某些信息。当确认框出现后&#xff0c;用户需要点击确定或者取消按钮才能继续进行操作。如果用户点击确认&#xff0c;那么返回值为 true。如果用户点击取消&#xff0c;那么返回值为 false。语法&#xff1a;confirm("文本")functi…

解决微信小程序 [Component] slot ““ is not found.

解决方式 当使用自定义组件或者slot标签作为组件A的插槽内容时&#xff0c;在组件A中必须定义一个默认插槽&#xff0c;对普通view等标签无限制。且因为wx:if为false的插槽等同没有定义 场景复现&#xff08;仅以自己遇到情况为例&#xff09; 1、调试基础库2.19.4 2、使用w…

列表排序应用FLIP动画(vue)

效果 原理详解 链接 1.beforeUpdate 获取first 变化前位置 (以id建立map映射) 2.updated 获取变化后位置 last 3.禁用transition并transform元素回初始位置 4.异步恢复transition 并取消 transform 代码 <template><div ref"container"><div style&…

面试项目亮点_码农:面试被问到自己项目亮点时,感觉自己的回答虚伪的不行!...

据我个人观察&#xff0c;大多数程序员都对自己现有的项目有吐糟的习惯&#xff0c;比如吐糟代码逻辑混乱&#xff0c;代码规范问题&#xff0c;代码可读性差&#xff0c;代码没有注释&#xff0c;没有文档&#xff0c;代码极度冗余等等&#xff0c;总之满眼看到的都是一些缺陷…

无敌小恐龙

断网恐龙小游戏无敌版&#xff0c;控制台输入 boxCompare _> false

怎样设计访谈提纲_论访谈提纲的设计

访谈提纲的设计一、访谈提纲如何设计:首先是该怎么命题&#xff0c;也就是访谈的主题或大题目是什么&#xff1b;其次是访谈的题目设计在多少比较合理&#xff1b;再次是访谈的主要点是什么&#xff1b;之后是各题目之间是什么关系&#xff1b;再后是访谈提纲设计注意哪些基本点…

微信小程序 仿 SwipeCell 的滑动单元格 SwipeBox

效果 代码 页面 调用Page <block wx:for"{{4}}" wx:key"{{item}}"><view style"text-align:center;padding:20px"><swipe-box><view slot"left" style"">左侧内容</view><view class&q…

u852日期限制解决补丁_《赛博朋克》1.06补丁出炉:进一步提升主机版本稳定性...

《赛博朋克2077》虽说是出师不利&#xff0c;但是开发商CDPR承诺自己会持续优化这款“尚待打磨”的作品&#xff0c;这种态度还是要稍微肯定一下的。我们看到之前CDPR就已经推送了1.05补丁&#xff0c;修复了大量的BUG以及问题&#xff0c;并且以游戏主机的BUG修复为重点&#…

微信小程序原生横向步骤条steps

效果 代码 调用 <rug-step options"{{steps}}" active"{{stepActive}}"></rug-step>steps: [{ label: 步骤1 },{ label: 步骤步骤步骤步骤2 },{ label: 步骤3 },{ label: 步骤步骤步骤步骤步骤4 },{ label: 步骤4 },{ label: 步骤4 },{ label…

华为云 手机 电脑登录不了怎么办 账户_华为云手机能解决芯片困难,是否真的实在,来西瓜视频找答案...

最近&#xff0c;网上到处流传着华为发布鲲鹏云手机的信息&#xff0c;有人说这个云手机能化解华为眼下的芯片燃眉之急的样子。事实真的如此吗?小编最近关注到&#xff0c;华为的鲲鹏云手机又成为大家关注和谈论的热点&#xff0c;甚至还有人说&#xff0c;华为有了云手机&…

单选复选状态控制类

场景 不同的平台写基础组件&#xff0c;写累了&#xff0c;对于单选复选这种逻辑闭合的组件&#xff0c;javascript 控制脚本是可以完全独立出来的&#xff0c;仅对外暴露状态即可根据不同的平台和环境进行视图的渲染 效果 使用 初始化 let selector new Selector({key: va…

康普顿效应是弹性碰撞吗_如何正确解读物理实验结果系列之十二——康普顿效应与光子...

作者&#xff1a;彭晓韬日期&#xff1a;2020年01月10日[文章摘要]&#xff1a;康普顿效应和光电效应一样&#xff0c;被广泛认定为支持光为光子的重要证据之一。但光电效应因无法解释紫限&#xff08;高于一定频率的光也不能产生光电效应&#xff09;现象而倍受质疑。同样地&a…

svn服务器搭建和使用 ubuntu_ubuntu下 SVN 服务器搭建及使用

简化篇http://blog.csdn.net/Eric_lmy/article/details/51942931详细篇1.安装Subversion ServerSubversion server binaries maintained by the Ubuntu Project. Packages include the Subversion client, and tools to create a Subversion repository and to make a reposito…

前端 滑动拼图校验 纯js组合式调用

前端 滑动拼图校验 纯js组合式调用效果思路代码效果 思路 独立滑块和拼图&#xff0c;通过实例方法组合使用,滑块和拼图均通过指定元素容器加载内容通过canvas 路径切片 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF…

一英寸芯片大小_科普:为什么标称1英寸的CMOS成像芯片,其对角线长度不是25.4mm?...

我们都知道&#xff0c;英寸和毫米的换算关系是&#xff1a;1英寸(inch) 25.4 mm。但是&#xff0c;对于一款CMOS成像芯片&#xff0c;虽然标称它的对角线尺寸为1英寸&#xff0c;实际测量只有大约16mm&#xff0c;和25.4mm相差甚远。这是为什么呢&#xff1f;这实际上是一个历…