科学计算器
支持函数、括号、阶乘和隐式乘法的表达式计算器,可以切角度和弧度,也能记内存和历史。
结果
输入表达式后按 Enter,或者用下面的按钮面板。
按钮面板
历史记录
还没有记录,算过之后会留在这里,最多 20 条。
为什么算出来的数不太对
最常见的原因是角度模式搞错。sin(30) 在 DEG 下是 0.5,在 RAD 下是 -0.9880316240928618,两个结果完全对不上,而且不会报错,所以算三角函数之前先看一眼当前是 DEG 还是 RAD。本站默认 DEG,反三角函数的结果也会跟着换算回去。
第二个原因是浮点数本身。计算机用二进制存小数,0.1 和 0.2 都存不成精确值,所以 0.1 + 0.2 等于 0.30000000000000004 而不是 0.3。这里的做法是默认保留若干位小数再抹掉末尾的零,看起来就是 0.3;但要知道那是「显示成 0.3」,内部值仍然带着误差。财务计算应该改用整数分(以分为单位算)或定点库,不要拿浮点数去比相等。
四舍五入也有坑。JavaScript 的 Math.round(-0.5) 得到 -0,而不是 -1,因为它始终往 +∞ 方向取整;toFixed 在遇到 1.005 这类二进制表示略小于字面值的数时,会给出 1.00 而不是 1.01。要严格按「四舍五入、逢五进一」处理金额,得先用字符串或整数做移位,别直接依赖 toFixed。
求值是自己写的词法分析和递归下降解析,没有用 eval 或 new Function。原因是表达式来自用户输入,eval 会把它当代码执行,一句 fetch 或 alert 就能在页面里跑起来;而这个站是纯静态的,没有服务端可以兜底。带白名单的解析器只认数字、括号、几个运算符和二十来个函数,遇到不认识的写法就报错,并指出是第几个字符出的问题。
有几处限制值得留意:阶乘只支持非负整数且不超过 170(再大就超出双精度范围了),取模对小数同样有效但结果符号跟着被除数走,除数为 0 会报「除零」而不是给出 Infinity。这些边界都按数学定义处理,不猜你想干什么。