JavaScript 实现基本计算器

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
JavaScript 实现基本计算器在课堂案例基础上更新以下功能
  • 更新 CSS 样式

  • 添加 M+、M-、MR、MC 功能:

  • 添加正负数切换功能

  • 操作符不能位于首位,连续输入时只显示最后输入的操作符

  • 除零错误

  • 按下 +-x÷ 后先计算结果,再添加操作符

JavaScript 代码如下
  1. // 定义 memory 变量,用于存储 M+、M- 数据
  2. let memory = 0;
  3. function calculator(ev){
  4. // 获取显示区 input 元素
  5. const result = document.querySelector('.result');
  6. // 获取显示区内容的最后一个字符,用于判断是否连续输入操作符
  7. const lastChar = result.value.slice(result.value.length - 1, result.value.length);
  8. let isLastCharOperator = false;
  9. if(lastChar == '+' || lastChar == '-' || lastChar == 'x' || lastChar == '÷'){
  10. isLastCharOperator = true;
  11. }
  12. // 如果点击的不是按钮则返回
  13. if (ev.target.tagName !== 'BUTTON') return false;
  14. // 获取当前按钮元素
  15. const curBtn = ev.target;
  16. // 获取当前按钮元素内容
  17. let content = curBtn.textContent;
  18. // 计算函数,+、-、X、/、= 五个操作符都会用到
  19. function calResult(){
  20. // 缓存结果
  21. let tmpResult = 0;
  22. try {
  23. // 如果是乘法,将 "x" 换成 "*"
  24. result.value = result.value.replace('x', '*');
  25. // 如果是除法,将 "÷" 换成 "/"
  26. result.value = result.value.replace('÷', '/');
  27. // 计算字符串表达式
  28. if(result.value == '错误'){
  29. tmpResult = 0;
  30. } else if(result.value.search('/') > 0){
  31. // 如果除于 0 显示“错误”
  32. const tempArr = result.value.split('/');
  33. if (tempArr[tempArr.length-1] == 0){
  34. tmpResult = '错误';
  35. } else {
  36. tmpResult = eval(result.value);
  37. }
  38. } else {
  39. tmpResult = eval(result.value);
  40. }
  41. // 如果结果是小数,仅保留5位就可以了
  42. if (tmpResult.toString().includes('.')) {
  43. tmpResult = tmpResult.toFixed(5);
  44. // 如果小数部分出现了多余的0,应该去掉(对结果精度没影响)
  45. tmpResult = parseFloat(tmpResult);
  46. }
  47. // 显示出结果
  48. result.value = tmpResult;
  49. } catch {
  50. result.value = '错误';
  51. }
  52. }
  53. // 操作符通用函数
  54. function fnOperator() {
  55. // 如果当前显示“错误”,归零
  56. if (result.value == '错误') {
  57. result.value = 0;
  58. } else if (isLastCharOperator) {
  59. // 连续输入操作符,显示最后按的操作符
  60. // 如果操作符后输入“=”,无操作
  61. if(content !== '='){
  62. result.value = result.value.slice(0, -1);
  63. result.value += content;
  64. }
  65. } else {
  66. calResult();
  67. // 计算结果是“错误”,则不加当前操作符
  68. if (result.value !== '错误'){
  69. // 当前按钮是“=”,也不加当前操作符
  70. if(content !== '='){
  71. result.value += content;
  72. }
  73. }
  74. }
  75. }
  76. // 根据用户点击的按钮内容确定要执行的操作
  77. switch (content){
  78. // AC 清零
  79. case 'AC': result.value = '0'; break;
  80. // CE: 退格
  81. case 'CE':
  82. // 如果结果区只有一位数字,或 “错误”,恢复为 0,否则删除最后一个字符
  83. if (result.value.length == 1 || result.value == '错误') {
  84. result.value = 0;
  85. } else {
  86. // 删除最后一个字符
  87. result.value = result.value.slice(0, -1);
  88. }
  89. break
  90. // M+ 累加存储数据
  91. case 'M+':
  92. // 判断显示区内容是否是纯数字
  93. // 如果不是纯数字(含有操作符),显示“错误”
  94. // 如果是纯数字,则将其转换成数值并累加到变量 memory
  95. if ( isNaN(Number(result.value)) ){
  96. result.value = '错误';
  97. } else {
  98. memory += Number(result.value);
  99. }
  100. break;
  101. case 'M-':
  102. // 判断显示区内容是否是纯数字
  103. // 如果不是纯数字(含有操作符),显示“错误”
  104. // 如果是纯数字,则将变量 memory 减去其转换成的数值
  105. if ( isNaN(Number(result.value)) ){
  106. result.value = '错误';
  107. } else {
  108. memory -= Number(result.value);
  109. }
  110. break;
  111. case 'MR':
  112. // 如果显示区不是纯数字
  113. // 1,“错误” => 将显示区内容改为变量 memory 的值
  114. // 2,含有操作符,则将 memory 值添加到操作符后面
  115. // 如果显示区为纯数字,将显示区内容改为变量 memory 的值
  116. if (result.value == '错误'){
  117. result.value = memory;
  118. } else if (isNaN(Number(result.value))){
  119. result.value += memory;
  120. } else {
  121. result.value = memory;
  122. }
  123. break;
  124. case 'MC':
  125. // 将变量 memory 的值清零
  126. memory = 0;
  127. break;
  128. case '±':
  129. // 判断显示区内容是否是纯数字
  130. // 如果不是纯数字(含有操作符),不进行任何操作
  131. // 如果是纯数字,则切换正负
  132. if ( isNaN(Number(result.value)) ){
  133. return false;
  134. } else {
  135. result.value = -result.value;
  136. }
  137. break;
  138. case '+': fnOperator(); break;
  139. case '-': fnOperator(); break;
  140. case 'x': fnOperator(); break;
  141. case '÷': fnOperator(); break;
  142. case '=': fnOperator(); break;
  143. default:
  144. // 如果当前结果区显示0,先清空, 防止出现前导0
  145. // 如果当前结果区显示“错误”,先清空
  146. if (result.value == 0 || result.value == '错误') {
  147. result.value = ''
  148. }
  149. result.value += content;
  150. }
  151. }
【转自:滨海网站设计公司 http://www.1234xp.com/binhai.html 欢迎留下您的宝贵建议】