knip智能工具箱
首页
工具中心
作品展示
登录
注册
简单计算器
工具
admin · 2026-08-29 · 使用 7
点赞
0
收藏
0
分享
反馈
支持加减乘除的简洁计算器,手机和电脑均可使用。
简单计算器
放大后操作
预览
代码
放大后操作(预览仅供参考)
纯前端工具,无后端代码
换行
HTML
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>简单计算器</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #1e3c72, #2a5298); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 16px; } .calculator { background: #1a1a2e; border-radius: 24px; padding: 20px; width: 100%; max-width: 360px; box-shadow: 0 20px 40px rgba(0,0,0,0.4); } .display { background: #0f0f1a; border-radius: 16px; padding: 20px; margin-bottom: 20px; text-align: right; min-height: 90px; display: flex; flex-direction: column; justify-content: flex-end; word-break: break-all; border: 1px solid #2a2a4a; } .expression { color: #8a8ab0; font-size: 16px; min-height: 24px; margin-bottom: 4px; } .result { color: #ffffff; font-size: 36px; font-weight: bold; line-height: 1.2; } .buttons { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; } button { background: #16213e; border: none; border-radius: 16px; color: #ffffff; font-size: 22px; font-weight: 600; padding: 18px 0; cursor: pointer; transition: all 0.15s ease; box-shadow: 0 4px 8px rgba(0,0,0,0.3); user-select: none; } button:active { transform: scale(0.95); background: #1f3a5f; } .operator { background: #2d4a7a; } .operator:active { background: #3a5f96; } .equals { background: #e94560; color: white; } .equals:active { background: #ff5d78; } .clear { background: #b83232; } .clear:active { background: #d84545; } .backspace { background: #b83232; } .backspace:active { background: #d84545; } .zero { grid-column: span 2; } @media (max-width: 360px) { .calculator { padding: 12px; } .buttons { gap: 8px; } button { font-size: 18px; padding: 14px 0; } .result { font-size: 28px; } } </style> </head> <body> <div class="calculator"> <div class="display"> <div class="expression" id="expression"> </div> <div class="result" id="result">0</div> </div> <div class="buttons"> <button class="clear" onclick="clearAll()">C</button> <button class="backspace" onclick="backspace()">⌫</button> <button class="operator" onclick="addOperator('%')">%</button> <button class="operator" onclick="addOperator('/')">÷</button> <button onclick="addNumber('7')">7</button> <button onclick="addNumber('8')">8</button> <button onclick="addNumber('9')">9</button> <button class="operator" onclick="addOperator('*')">×</button> <button onclick="addNumber('4')">4</button> <button onclick="addNumber('5')">5</button> <button onclick="addNumber('6')">6</button> <button class="operator" onclick="addOperator('-')">-</button> <button onclick="addNumber('1')">1</button> <button onclick="addNumber('2')">2</button> <button onclick="addNumber('3')">3</button> <button class="operator" onclick="addOperator('+')">+</button> <button class="zero" onclick="addNumber('0')">0</button> <button onclick="addDot()">.</button> <button class="equals" onclick="calculate()">=</button> </div> </div> <script> let expression = ''; let lastResult = null; const expressionEl = document.getElementById('expression'); const resultEl = document.getElementById('result'); function updateDisplay() { expressionEl.textContent = expression || ' '; if (expression) { // 尝试实时计算中间结果 try { const val = evalExpression(expression); if (val !== null && isFinite(val)) { resultEl.textContent = formatNumber(val); } else { resultEl.textContent = '0'; } } catch(e) { resultEl.textContent = '0'; } } else { resultEl.textContent = (lastResult !== null) ? formatNumber(lastResult) : '0'; } } function formatNumber(num) { if (Number.isInteger(num)) return num.toString(); // 避免浮点误差 const rounded = Math.round(num * 1e10) / 1e10; return rounded.toString(); } function evalExpression(expr) { // 简单安全的表达式求值,只允许数字和运算符 if (!/^[0-9.\s+\-*/%]+$/.test(expr)) return null; try { // 处理百分号: 将 x% 替换为 x/100 let cleanExpr = expr; // 使用 Function 代替 eval (同样有风险,但这里输入已过滤) // 更安全:手动解析 return parseAndEval(cleanExpr); } catch(e) { return null; } } // 手动解析四则运算,避免 eval 风险 function parseAndEval(expr) { // 移除空格 expr = expr.replace(/\s+/g, ''); if (!expr) return null; // 解析为 token const tokens = []; let numBuffer = ''; for (let i = 0; i < expr.length; i++) { const ch = expr[i]; if ('0123456789.'.indexOf(ch) !== -1) { numBuffer += ch; } else if ('+-*/%'.indexOf(ch) !== -1) { if (numBuffer === '' && (ch === '-' || ch === '+') && tokens.length === 0) { numBuffer = ch; continue; } if (numBuffer !== '') { tokens.push(parseFloat(numBuffer)); numBuffer = ''; } tokens.push(ch); } else { return null; } } if (numBuffer !== '') tokens.push(parseFloat(numBuffer)); else return null; // 处理百分号: 将 a% 变为 a/100 for (let i = 0; i < tokens.length; i++) { if (tokens[i] === '%') { if (i > 0 && typeof tokens[i-1] === 'number') { tokens[i-1] = tokens[i-1] / 100; tokens.splice(i, 1); i--; } else { return null; } } } // 先乘除后加减 const stack = [tokens[0]]; for (let i = 1; i < tokens.length; i += 2) { const op = tokens[i]; const num = tokens[i+1]; if (num === undefined) return null; if (op === '*') { stack.push(stack.pop() * num); } else if (op === '/') { if (num === 0) return Infinity; stack.push(stack.pop() / num); } else { stack.push(op); stack.push(num); } } // 处理加减 let result = stack[0]; for (let i = 1; i < stack.length; i += 2) { const op = stack[i]; const num = stack[i+1]; if (op === '+') result += num; else if (op === '-') result -= num; } return result; } function addNumber(num) { // 避免多个前导零 if (expression === '0' && num === '0') return; if (expression === '0') { expression = num; } else { expression += num; } updateDisplay(); } function addOperator(op) { if (!expression && lastResult !== null) { // 从结果继续计算 expression = formatNumber(lastResult) + op; lastResult = null; } else if (expression) { // 替换末尾运算符 const lastChar = expression[expression.length - 1]; if ('+-*/%'.indexOf(lastChar) !== -1) { expression = expression.slice(0, -1) + op; } else { expression += op; } } else { // 无输入,忽略 return; } updateDisplay(); } function addDot() { if (!expression) { expression = '0.'; } else { // 检查当前数字是否已有小数点 const parts = expression.split(/[+\-*/%]/); const current = parts[parts.length - 1]; if (current.includes('.')) return; expression += '.'; } updateDisplay(); } function calculate() { if (!expression) return; const result = parseAndEval(expression); if (result === null || result === undefined) { resultEl.textContent = '错误'; return; } if (!isFinite(result)) { resultEl.textContent = '错误'; expression = ''; lastResult = null; updateDisplay(); return; } const formatted = formatNumber(result); expression = ''; lastResult = formatted; expressionEl.textContent = ''; resultEl.textContent = formatted; } function clearAll() { expression = ''; lastResult = null; expressionEl.textContent = ' '; resultEl.textContent = '0'; } function backspace() { if (expression.length > 0) { expression = expression.slice(0, -1); updateDisplay(); } else if (lastResult !== null) { lastResult = null; resultEl.textContent = '0'; } } // 键盘支持 document.addEventListener('keydown', function(e) { const key = e.key; if (key >= '0' && key <= '9') { addNumber(key); } else if (key === '.') { addDot(); } else if (key === '+' || key === '-' || key === '*' || key === '/') { addOperator(key); } else if (key === '%') { addOperator('%'); } else if (key === 'Enter' || key === '=') { calculate(); } else if (key === 'Backspace') { backspace(); } else if (key === 'Escape') { clearAll(); } e.preventDefault(); }); updateDisplay(); </script> </body> </html>
评论(0)
暂无评论,来说两句吧
分享「简单计算器」
微信扫一扫,分享给朋友
复制链接
QQ 分享
微博分享
微信内也可以点右上角
菜单分享
反馈「简单计算器」问题
工具哪里不好用、报错或结果不对?反馈会直接通知作品作者处理。
0 / 500
无需登录,可直接提交
暂无评论,来说两句吧