|
借助于Mediawiki的扩展“函数解析器”,进行计算变得可行。
- 注意:目前此功能还有bug,详情见meta:Talk:ParserFunctions#Bugs。
expr函数,计算数学表达式。语法为:
{{ #expr: 表达式 }}
表达式支持的运算符有:
| 运算符 |
名称 |
优先级 |
元数 |
结合性 |
样例 |
| + |
正 |
9 |
1 |
右 |
{{#expr: + 7}} = 7 |
| - |
负 |
9 |
1 |
右 |
{{#expr: - 7}} = -7 |
| not |
逻辑非 |
9 |
1 |
右 |
{{#expr: not 7}} = 0 |
| * |
乘 |
8 |
2 |
左 |
{{#expr: 30 * 7}} = 210 |
| / |
除 |
8 |
2 |
左 |
{{#expr: 30 / 7}} = 4.2857142857143 |
| div |
除 |
8 |
2 |
左 |
{{#expr: 30 div 7}} = 4.2857142857143 |
| mod |
模 |
8 |
2 |
左 |
{{#expr: 30 mod 7}} = 2 |
| + |
加 |
6 |
2 |
左 |
{{#expr: 30 + 7}} = 37 |
| - |
减 |
6 |
2 |
左 |
{{#expr: 30 - 7}} = 23 |
| round |
舍入 |
5 |
2 |
左 |
{{#expr: 30 / 7 round 7}} = 4.2857143 |
| = |
等于 |
4 |
2 |
左 |
{{#expr: 30 = 7}} = 0 |
| < |
小于 |
4 |
2 |
左 |
{{#expr: 30 < 7}} = 0 |
| > |
大于 |
4 |
2 |
左 |
{{#expr: 30 > 7}} = 1 |
| <= |
小于等于 |
4 |
2 |
左 |
{{#expr: 30 <= 7}} = 0 |
| >= |
大于等于 |
4 |
2 |
左 |
{{#expr: 30 >= 7}} = 1 |
| <> |
不等于 |
4 |
2 |
左 |
{{#expr: 30 <> 7}} = 1 |
| != |
不等于 |
4 |
2 |
左 |
{{#expr: 30 != 7}} = 1 |
| and |
逻辑与 |
3 |
2 |
左 |
{{#expr: 30 and 7}} = 1 |
| or |
逻辑或 |
2 |
2 |
左 |
{{#expr: 30 or 7}} = 1 |
round运算对运算数正负,位数正负都有不同的表现,参见下例。
逻辑运算符把假映射为0,把真映射为非0,且返回值只有0或1。
同一表达式中先计算高优先级运算。括号优先级高于一切。
[编辑] 样例
{{#expr: (100 - 32) / 9 * 5 round 0 }} = 38:摄氏华氏温度度转换
{{#expr: 3 < 2 < 1}} = 1
{{#expr: 2 = 2 = 1}} = 1:与数学表达式不同,“=”、“<”、“>”等运算符有返回值
{{#expr: 999 * 999 round -2}} = 998000
{{#expr: 999 * 999 round -20}} = 0
{{#expr: 999 * 999 round -2.9}} = 998000:round的危险用法
{{#expr: 0 or 1 and 0}} = 0:优先级演示
{{#expr: 10.9 mod 2}} = 0:mod的危险用法
{{#expr: 30------7}} = 23
{{#expr: 30+++++7}} = 37:“+”、“-”运算符有两种含义
{{#expr: .}} = 0
{{#expr: .1.1}} = 0.1:实数表达法的强壮性
{{#expr: ( ( ) )}} = :特殊的括号用法,没有实际意义
{{#expr: 999999999*...*999999999}} = INF:数字上溢的结果
[编辑] 错误
此函数进行错误检查并给出信息。
- Expression error: stack exhausted:表达式太长,栈耗尽;
- Expression error: unexpected number:不可预期的数字;
- Expression error: unexpected preg_match failure:运算符匹配失败;
- Expression error: unrecognised word "$1":不可识别的运算符;
- Expression error: unexpected $1 operator:不可预期的运算符;
- Expression error: Missing operand for $1:缺少运算数;
- Expression error: unexpected closing bracket:不可预料的“)”
- Expression error: unrecognised punctuation character "$1":不可识别的标点字符;
- Expression error: unclosed bracket:缺少“)”
- Division by zero:零除错误。
[编辑] 错误的样例
{{#expr: ---...---1}}(110个“-”) = Expression error: Stack exhausted
{{#expr: ( ) 1}} = Expression error: Unexpected number
{{#expr: 2 d 1}} = Expression error: Unrecognised word "d"
{{#expr: * 1}} = Expression error: Unexpected * operator
{{#expr: -}} = Expression error: Missing operand for -
{{#expr: ( 1 ) )}} = Expression error: Unexpected closing bracket
{{#expr: 壹}} = Expression error: Unrecognised punctuation character "�"
{{#expr: ( 1}} = Expression error: Unclosed bracket
{{#expr: 1 / 0}} = Division by zero
[编辑] 误差
浮点误差有可能造成某些运算的不可预料的结果,特别是最后几位数字的不精确。因此在使用此函数进行实数运算时,注意不要进行比较运算。
[编辑] 注意内部数字表示
{{#expr: 100000000000000000}} = 1E+17
{{#expr: {{#expr: 100000000000000000}}}} = Expression error: Unrecognised word "e"
{{#expr: (-1.5-0.5 round 0)+2}} = 0
{{#expr: -0.1 round 0}} = -0
在返回值中,有可能出现无法再计算的数的情况,或者有一部分有效数字没有显示出来。因此在使用此函数进行运算时,须注意这些问题。
[编辑] 参见
|