科学计算器
支持三角函数、对数、阶乘等高级计算功能。
历史
尚无计算
这是一个基于浏览器、使用自写表达式解析器的科学计算器。它处理便携计算器应有的四则运算,并额外支持三角函数、对数、幂、开方和阶乘;它通过一条可见的表达式行展示运算过程,而不是只显示一个不断变化的数字。由于解析器是自研的,工具不调用 JavaScript 的 eval(),你输入的任何内容都不会离开页面。
使用方法
可以直接在显示屏上键入,也可以点击屏幕按键。两种方式构建的是同一个表达式字符串。
- 输入表达式,例如
3 + 4 * 2。 - 求值前先为三角函数选择 DEG 或 RAD。
- 按
=或回车。结果会替换显示屏上的表达式,完整表达式显示在其上方。 - 用功能键输入
sqrt、log、ln、log2、sin、cos、tan及其反函数,pi和e键插入常数。 - 用 C 键清除,开始一次新的计算。
布局是响应式的,同一套键盘在手机屏幕上无需缩放即可使用。
实操示例
| 表达式 | 模式 | 结果 | 原因 |
|---|---|---|---|
18 + 24 / 6 | 任意 | 22 | 除法比加法结合更紧 |
sin(30) | DEG | 0.5 | 30 度化为 pi/6 弧度 |
sin(pi/2) | RAD | 1 | 弧度下的四分之一圈 |
log(1000) | 任意 | 3 | log 以 10 为底 |
ln(e) | 任意 | 1 | e 的自然对数 |
5! | 任意 | 120 | 5 * 4 * 3 * 2 * 1 |
2^3^2 | 任意 | 512 | 右结合:2^9 |
sqrt(2) | 任意 | 1.41421356... | 无理数,显示为舍入值 |
17 % 5 | 任意 | 2 | 求余,不是百分比 |
这些例子也可用来快速确认你处在预期的角度模式。如果 sin(30) 返回接近 0.988 而不是 0.5,说明你在 RAD 模式。
解析器如何求值
输入分三个阶段处理,全程都不使用 eval():
- 分词 —— 字符串被拆分为数字、运算符、函数名、常数、括号和后缀
!。空格被忽略,因此1 + 2与1+2相同。 - 调度场算法 —— 借助运算符优先级栈,把记号重排为逆波兰记法。结合性就在这里确定。
- RPN 求值 —— 从左到右消费一个数值栈,得到最终值。
优先级从松到紧:
| 层级 | 运算符 | 结合性 |
|---|---|---|
| 1 | + - | 左 |
| 2 | * / % | 左 |
| 3 | ^ | 右 |
| 4 | !(后缀) | — |
一元负号在分词阶段处理:出现在表达式开头,或紧跟在 (、^、*、/、%、+ 或另一个 - 之后的 -,会被并入后面的数字。因此 -3^2 变成 (-3)^2 = 9。如果你想要常规的 -(3^2),请自己加上括号。
角度与弧度
DEG/RAD 开关只影响 sin、cos、tan、asin、acos 和 atan;算术和对数不受影响。
在 DEG 模式下,工具会机械地重写表达式。正向三角函数调用的参数乘以 pi / 180,反三角调用的结果乘以 180 / pi。也就是说:
sin(90)DEG =1cos(180)DEG =-1atan(1)DEG =45sin(1)DEG ≈0.0174524(1 度,不是 1 弧度)
在 RAD 模式下,函数直接映射到 JavaScript 的 Math 库,因此 tan(pi/4) = 1,asin(1) ≈ 1.5707963。
什么会触发错误
计算器会报告一小类错误,而不是显示 NaN 或 Infinity:
- 除以零 ——
5 / 0被拒绝,而不是返回 Infinity。 - 负数或非整数阶乘 ——
(-3)!和0.5!都失败;0!没问题。 - 括号不匹配 —— 未闭合或多出的
)会中断求值。 - 非有限结果 ——
sqrt(-1)、ln(-1)和log(0)都会产生NaN或无穷,工具会将其标记。这里不支持复数。
还有两个限制值得了解。结果使用 IEEE-754 双精度,因此 0.1 + 0.2 会显示为 0.30000000000000004;工具不会四舍五入到固定小数位。另外函数名按整体匹配,所以必须写 sin(30) 而不能写 sin 30。
实用技巧
- 在数字与常数或函数之间显式写出
*。2pi不是隐式乘法:分词器会得到两个相邻操作数,求值以Invalid expression失败。请写2*pi。 - 不支持科学计数法输入。
1e3会被读成数字 1、常数e、再是 3,无法求值。请输入1000,或用10^3来表示这个幂。 - 允许以小数点开头,因此
.5和0.5结果相同。 - 当幂次的含义很关键时,把负底数用括号包起来。分词器会把开头的负号并入数字,所以
-2^2被当作(-2)^2 = 4。若按通常的数学读法,请写-(2^2)得到-4。 - 用表达式内的除法检查分数。
22/7返回3.142857142857143,一个常见的 pi 近似值。 - 结果可以从显示屏上选中并复制,便于粘贴到文档或另一次计算中。
使用场景
- 检查三角函数、对数和阶乘作业,而手机计算器应用往往隐藏运算过程。
- 快速工程运算,希望
pi、e、log2和sqrt都在一屏之内。 - 在课堂上演示运算符优先级和 DEG/RAD 换算,因为表达式与结果始终同时可见。
- 统计与组合数学,中等规模数字的阶乘很常见。
相关工具
常见问题
这个计算器支持哪些函数和常数?
它支持四则运算以及取模(%)、用 ^ 表示幂、平方根(sqrt)、阶乘(!)、以 10 为底的对数(log)、自然对数(ln)、以 2 为底的对数(log2),还有三角函数 sin、cos、tan 及其反函数 asin、acos、atan。常数 pi 和 e 可用,log2 被识别为独立函数而不是 log(2)。
为什么 sin(30) 在 DEG 模式下是 0.5,在 RAD 模式下却不同?
DEG 模式会在求值前重写参数:sin(30) 变成 sin(30 * pi / 180),即 sin(pi/6) = 0.5。RAD 模式直接把 30 传进去,而 30 弧度约为 0.988。反函数则反向换算,因此 asin(0.5) 在 DEG 模式下返回 30,在 RAD 模式下约为 0.5236。
2^3^2 是按 (2^3)^2 还是 2^(3^2) 计算?
按数学标准记法从右到左计算。幂运算符是右结合的,因此 2^3^2 解析为 2^(3^2) = 2^9 = 512,而不是 64。其余所有二元运算符都是左结合。
% 按钮是用来算百分比的吗?
不是。% 是取模(求余)运算符,所以 17 % 5 = 2。要计算某个值的百分比,请把它写成分数,例如 200 * 15 / 100 = 30。
为什么 0.5! 会报错?
在这里阶乘只对非负整数有定义。0.5! 因为不是整数而失败,(-3)! 因为负数阶乘无定义而失败。0! 是允许的,返回 1。
sin、sqrt 这类函数名后面必须加括号吗?
必须,始终要加。sin(90) 没有歧义,但 sin90 会把函数留在运算符栈上,而在更长的表达式如 sin30+2 中,函数会吞下整个和式,算出 sin(32)。每个函数都要写成 名称(参数)。
由 HandyTools Hub 团队审校 · 最后更新