Login.png
您还没有登录,请http://wiki.sosg.net/skins/monobook/user.gif点此登录后进行编辑。
如果您还没有在SOSG WIKI注册,请http://wiki.sosg.net/skins/monobook/user.gif点此注册
请注意SOSG WIKI的账号是不同于SOSG论坛账号的。


帮助:计算

来自SOSG Wiki
跳转至: 导航搜索

25px 维基百科使用手册目录 · 關於 · 阅读 · 编辑 · 管理 · 开发 · 附錄 · 元-{zh-hans:帮助;zh-hant:幫助;zh-tw:說明;}-

借助于Mediawiki的扩展“函数解析器”,进行计算变得可行。

注意:目前此功能还有bug,详情见meta:Talk:ParserFunctions#Bugs

expr函数,计算数学表达式。语法为:

{{ #expr: 表达式 }}

表达式支持的运算符有:

运算符 名称 优先级 元数 结合性 样例
+ 9 1 {{#expr: + 7}} = {{#expr: + 7}}
- 9 1 {{#expr: - 7}} = {{#expr: - 7}}
not 逻辑非 9 1 {{#expr: not 7}} = {{#expr: not 7}}
* 8 2 {{#expr: 30 * 7}} = {{#expr: 30 * 7}}
/ 8 2 {{#expr: 30 / 7}} = {{#expr: 30 / 7}}
div 8 2 {{#expr: 30 div 7}} = {{#expr: 30 div 7}}
mod 8 2 {{#expr: 30 mod 7}} = {{#expr: 30 mod 7}}
+ 6 2 {{#expr: 30 + 7}} = {{#expr: 30 + 7}}
- 6 2 {{#expr: 30 - 7}} = {{#expr: 30 - 7}}
round 舍入 5 2 {{#expr: 30 / 7 round 7}} = {{#expr: 30 / 7 round 7}}
= 等于 4 2 {{#expr: 30 = 7}} = {{#expr: 30 = 7}}
< 小于 4 2 {{#expr: 30 < 7}} = {{#expr: 30 < 7}}
> 大于 4 2 {{#expr: 30 > 7}} = {{#expr: 30 > 7}}
<= 小于等于 4 2 {{#expr: 30 <= 7}} = {{#expr: 30 <= 7}}
>= 大于等于 4 2 {{#expr: 30 >= 7}} = {{#expr: 30 >= 7}}
<> 不等于 4 2 {{#expr: 30 <> 7}} = {{#expr: 30 <> 7}}
 != 不等于 4 2 {{#expr: 30 != 7}} = {{#expr: 30 != 7}}
and 逻辑与 3 2 {{#expr: 30 and 7}} = {{#expr: 30 and 7}}
or 逻辑或 2 2 {{#expr: 30 or 7}} = {{#expr: 30 or 7}}

round运算对运算数正负,位数正负都有不同的表现,参见下例。

逻辑运算符把假映射为0,把真映射为非0,且返回值只有0或1。

同一表达式中先计算高优先级运算。括号优先级高于一切。

样例

  • {{#expr: (100 - 32) / 9 * 5 round 0 }} = {{#expr: (100 - 32) / 9 * 5 round 0 }}:摄氏华氏温度度转换
  • {{#expr: 3 < 2 < 1}} = {{#expr: 3 < 2 < 1}}
  • {{#expr: 2 = 2 = 1}} = {{#expr: 2 = 2 = 1}}:与数学表达式不同,“=”、“<”、“>”等运算符有返回值
  • {{#expr: 999 * 999 round -2}} = {{#expr: 999 * 999 round -2}}
  • {{#expr: 999 * 999 round -20}} = {{#expr: 999 * 999 round -20}}
  • {{#expr: 999 * 999 round -2.9}} = {{#expr: 999 * 999 round -2.9}}:round的危险用法
  • {{#expr: 0 or 1 and 0}} = {{#expr: 0 or 1 and 0}}:优先级演示
  • {{#expr: 10.9 mod 2}} = {{#expr: 10.9 mod 2}}:mod的危险用法
  • {{#expr: 30------7}} = {{#expr: 30-----7}}
  • {{#expr: 30+++++7}} = {{#expr: 30+++++7}}:“+”、“-”运算符有两种含义
  • {{#expr: .}} = {{#expr: .}}
  • {{#expr: .1.1}} = {{#expr: .1.1}}:实数表达法的强壮性
  • {{#expr: ( ( ) )}} = {{#expr: ( ( ) )}}:特殊的括号用法,没有实际意义
  • {{#expr: 999999999*...*999999999}} = {{#expr: 999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999*999999999}}:数字上溢的结果

错误

此函数进行错误检查并给出信息。

  • 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个“-”) = {{#expr: --------------------------------------------------------------------------------------------------------------1}}
  • {{#expr: ( ) 1}} = {{#expr: ( ) 1}}
  • {{#expr: 2 d 1}} = {{#expr: 2 d 1}}
  • {{#expr: * 1}} = {{#expr: * 1}}
  • {{#expr: -}} = {{#expr: -}}
  • {{#expr: ( 1 ) )}} = {{#expr: ( 1 ) )}}
  • {{#expr: 壹}} = {{#expr: 壹}}
  • {{#expr: ( 1}} = {{#expr: ( 1}}
  • {{#expr: 1 / 0}} = {{#expr: 1 / 0}}

误差

浮点误差有可能造成某些运算的不可预料的结果,特别是最后几位数字的不精确。因此在使用此函数进行实数运算时,注意不要进行比较运算。

注意内部数字表示

  • {{#expr: 100000000000000000}} = {{#expr: 100000000000000000}}
  • {{#expr: {{#expr: 100000000000000000}}}} = {{#expr: {{#expr: 100000000000000000}}}}
  • {{#expr: (-1.5-0.5 round 0)+2}} = {{#expr: (-1.5-0.5 round 0)+2}}
  • {{#expr: -0.1 round 0}} = {{#expr: -0.1 round 0}}

在返回值中,有可能出现无法再计算的数的情况,或者有一部分有效数字没有显示出来。因此在使用此函数进行运算时,须注意这些问题。

参见

{{#switch:|subgroup|child=</div>|none=|#default=