维基百科使用手册

借助于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: 1 or 1 and 0}} = 1:优先级演示
  • {{#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:数字上溢的结果
  • {{#expr:(-1)^0.5}} = NAN:無法對虛數單位進行計算
  • {{Root|(-1)}} = i:使用根號模板(詳見Template:複變運算
  • {{複變運算|(-1)^0.5}} = i:使用複變運算模板
  • {{複變運算|e^(((-1)^0.5) * pi)}} = -1:歐拉恆等式
  • {{#expr:e^(((-1)^0.5) * pi)}} = NAN:對比使用普通運算功能的
    表達式 參數 運算子 PHP 資料型態 優先級 範例
    - 1 一元 - 符號 (負號) - 與參數相同 10
    {{#expr:-12}} -12
    {{#expr:-trunc12}} -12
    {{#expr:-trunc(-2^63)}} 9.2233720368548E+18
    e
    (位於子表達式之間)
    2 *10^
    以10為底的指數
    科學記號
    * pow (10,..) 浮點數,除非左邊的參數是整數且指數是非負整數 10
    {{#expr:2e3}} 2000
    {{#expr:-2.3e-4}} -0.00023
    {{#expr:(trunc2)e(trunc-3)}} 0.002
    {{#expr:(trunc2)e(trunc0)}} 2
    {{#expr:(trunc2)e(trunc18)}} 2000000000000000000
    {{#expr:(trunc2)e(trunc19)}} 2.0E+19
    {{#expr:6e(5-2)e-2}} 60
    {{#expr:1e.5}} 3.1622776601684

    錯誤範例:

    {{#expr:e4}} 表达式错误:未预料的数字。
    exp 1 自然指數函數 ex exp 浮點數 9
    {{#expr:exp43}} 4.7278394682293E+18
    {{#expr:exp trunc0}} 1
    {{#expr:exp709}} 8.218407461555E+307
    {{#expr:exp-744}} 9.8813129168249E-324

    比較:

    {{#expr:e^43}} 4.7278394682293E+18
    {{#expr:trunc exp43}} 4727839468229346304
    ln 1 自然對數 log 浮點數 9
    {{#expr:ln2}} 0.69314718055995
    {{#expr:ln trunc1}} 0
    {{#expr:ln8.9e307}} 709.07967482591
    {{#expr:ln.5e-323}} -744.44007192138

    可用換底公式轉換為常用對數,例如 log 2 ≒ 0.3010:

    {{#expr:ln2/ln10}} 0.30102999566398
    abs 1 絕對值 abs 同於輸入值,並且非負 9
    {{#expr:abs-2}} 2
    {{#expr:abs trunc-2}} 2
    {{#expr:abs trunc-2^63}} 9.2233720368548E+18
    sqrt 1 平方根 sqrt 浮點數 9
    {{#expr:sqrt 4}} 2
    {{#expr:sqrt 2}} 1.4142135623731
    {{#expr:sqrt 1e19}} 3162277660.1684

    此平方根計算無法處理結果為虛數複數的情況
    即對負值進行平方根會發生錯誤:

    {{#expr:sqrt-1}} 在sqrt中:结果不是数字。
    trunc 1 截尾函數 (int), 即轉換型態整數 整數 9
    {{#expr:trunc1.2}} 1
    {{#expr:trunc1.8}} 1
    {{#expr:trunc-1.2}} -1
    {{#expr:trunc(-2^64+1e5)}} 98304
    {{#expr:trunc(-2^63+1e5)}} -9223372036854675456
    {{#expr:trunc(2^63)}} -9223372036854775808
    {{#expr:trunc(2^63+1e5)}} -9223372036854675456
    {{#expr:trunc(2^64+1e5)}} 98304
    floor 1 向下取整函数 floor 浮點數 9
    {{#expr:floor1.2}} 1
    {{#expr:floor-1.2}} -2
    {{#expr:floor trunc3}} 3
    ceil 1 向上取整函数 ceil 浮點數 9
    {{#expr:ceil1.2}} 2
    {{#expr:ceil-1.2}} -1
    {{#expr:ceil trunc3}} 3
    sin 1 正弦函數 sin 浮點數 9
    {{#expr:sin.1}} 0.099833416646828
    {{#expr:sin trunc1}} 0.8414709848079

    若要使用角度(如30°)可表達為:

    {{#expr:sin(30*pi/180)}} 0.5
    cos 1 餘弦函數 cos 浮點數 9
    {{#expr:cos.1}} 0.99500416527803
    {{#expr:cos trunc1}} 0.54030230586814
    tan 1 正切函數 tan 浮點數 9
    {{#expr:tan.1}} 0.10033467208545
    {{#expr:tan trunc1}} 1.5574077246549
    asin 1 反正弦 asin 浮點數 9
    {{#expr:asin.1}} 0.10016742116156
    {{#expr:asin trunc1}} 1.5707963267949
    acos 1 反餘弦 acos 浮點數 9
    {{#expr:acos.1}} 1.4706289056333
    {{#expr:acos trunc1}} 0
    {{#expr:2*acos 0}} 3.1415926535898
    atan 1 反正切 atan 浮點數 9
    {{#expr:atan.1}} 0.099668652491162
    {{#expr:atan trunc1}} 0.78539816339745
    {{#expr:4*atan 1}} 3.1415926535898
    not 1 逻辑非 ! 以整數表達
    布林值
    (1 或 0)
    9
    {{#expr:not0}} 1
    {{#expr:not1}} 0
    {{#expr:not2}} 0
    {{#expr:not trunc1}} 0
    ^ 2 指數 pow 原則上為浮點數。若底數為整數且指數為非負整數則為整數 8
    {{#expr:2^3}} 8
    {{#expr:-2^3}} -8
    {{#expr:-2^4}} 16
    {{#expr:(trunc2)^(trunc-3)}} 0.125
    {{#expr:(trunc2)^(trunc0)}} 1
    {{#expr:(trunc2)^(trunc62)}} 4611686018427387904
    {{#expr:(trunc2)^(trunc63)}} 9.2233720368548E+18
    {{#expr:(-2)^1.2}} NAN
    {{#expr:(-2)^.5}} NAN
    * 2 乘法 * 若兩參數為整數,則為整數,否則為浮點數 7
    {{#expr:2*3}} 6
    {{#expr:(trunc2)*3}} 6
    {{#expr:2*trunc3}} 6
    {{#expr:(trunc2)*trunc3}} 6
    {{#expr:(trunc1e10)*trunc1e9}} 1.0E+19
    / (或寫作div 2 除法
    (div非整數除法[1])
    / 原則上為浮點數。若兩參數皆為整數且整除則為整數 7
    {{#expr:6/3}} 2
    {{#expr:(trunc6)/3}} 2
    {{#expr:2/trunc6}} 0.33333333333333
    {{#expr:(trunc6)/trunc3}} 2
    {{#expr:(trunc6)/trunc4}} 1.5
    mod 2 模除。 實行帶餘除法
    時會將前後兩數截
    成整數。[1]
    % 整數 7
    {{#expr:30mod7}} 2
    {{#expr:-30mod7}} -2
    {{#expr:30mod-7}} 2
    {{#expr:-30mod-7}} -2
    {{#expr:30.5mod7.9}} 2

    部分除數無法取餘數 (見限制章節):

    {{#expr:123mod2^64}} 零除。
    fmod 2 模除,浮點數版本。
    返回減去第二參數之整數
    倍的第一參數。
    fmod 浮點數 7
    {{#expr:5.7fmod1.3}} 0.5
    {{#expr:99.9fmod60}} 39.9
    {{#expr:2.99fmod1}} 0.99
    {{#expr:-2.99fmod1}} -0.99
    {{#expr:2.99fmod-1}} 0.99
    {{#expr:-2.99fmod-1}} -0.99
    + 2 加法 + 若兩參數皆為整數則為整數,其餘浮點數 6
    {{#expr:2+3}} 5
    {{#expr:(trunc2)+3}} 5
    {{#expr:2+trunc3}} 5
    {{#expr:(trunc2)+trunc3}} 5
    {{#expr:(trunc7e18)+trunc4e18}} 1.1E+19
    - 2 減法 - 若兩參數皆為整數則為整數,其餘浮點數 6
    {{#expr:3-2}} 1
    {{#expr:(trunc3)-2}} 1
    {{#expr:2-trunc2}} 0
    {{#expr:(trunc3)-trunc2}} 1
    {{#expr:(trunc-7e18)-trunc4e18}} -1.1E+19
    round 2 將指定的小數位數
    四捨五入,若為
    負值則會對指數
    為數做四捨五入。
    round 浮點數 5
    {{#expr:9.876round2}} 9.88
    {{#expr:(trunc1234)round trunc-2}} 1200
    {{#expr:4.5round0}} 5
    {{#expr:-4.5round0}} -5
    {{#expr:46.857round1.8}} 46.9
    {{#expr:46.857round-1.8}} 50
    = 2 相等(數字或邏輯的
    相等運算,不支援
    字串比對)
    == 以整數表達
    布林值
    (1 或 0)
    4
    {{#expr:3.0=3}} 1
    {{#expr:3.1=3}} 0
    {{#expr:3.0=trunc3}} 1
    {{#expr:3.1=trunc3}} 0
    {{#expr:1e16=trunc(1e16)}} 1
    {{#expr:1e16=trunc(1e16)+trunc1}} 1
    {{#expr:trunc(1e16)=trunc(1e16)+trunc1}} 0

    錯誤用法:

    {{#expr:a=a}} 表达式错误:无法识别的词语“a”。
    < 2 小於(不適用於字串
    比較)
    < 以整數表達
    布林值
    (1 或 0)
    4
    {{#expr:3<3}} 0
    {{#expr:3<4}} 1
    {{#expr:2.9<3}} 1
    {{#expr:3.0<3}} 0
    {{#expr:2.9<trunc3}} 1
    {{#expr:3.0<trunc3}} 0
    {{#expr:1e16<trunc(1e16)+trunc1}} 0

    wrong:

    {{#expr:a<b}} 表达式错误:无法识别的词语“a”。
    > 2 大於(當參數顛倒時
    與 < 相同)
    > 以整數表達
    布林值
    (1 或 0)
    4
    {{#expr:4>3}} 1
    {{#expr:3>3}} 0
    <= 2 小於等於(當參數
    顛倒時與 >= 相同)
    <= 以整數表達
    布林值
    (1 或 0)
    4
    {{#expr:3<=4}} 1
    {{#expr:3<=3}} 1
    >= 2 大於等於(<的否定) >= 以整數表達
    布林值
    (1 或 0)
    4
    {{#expr:4>=3}} 1
    {{#expr:3>=3}} 1
    and 2 逻辑与 && 以整數表達
    布林值
    (1 或 0)
    3
    {{#expr:3and4}} 1
    {{#expr:-3and0}} 0
    {{#expr:0and4}} 0
    {{#expr:0and0}} 0
    or 2 逻辑或 || 以整數表達
    布林值
    (1 或 0)
    2
    {{#expr:3or4}} 1
    {{#expr:-3or0}} 1
    {{#expr:0or4}} 1
    {{#expr:0or0}} 0
    + 1 一元 + 符號 (正號) (不適用) 與參數相同 不適用
    {{#expr:+1}} 1
    {{#expr:+-1}} -1
    {{#expr:+trunc1}} 1
    (數字) 0 普通十進制的無符號
    數字(一元加e
    被視為運算符,請
    參見本表的其他地方)
    floatval 浮點數 不適用
    {{#expr:1234567890123456789}} 1.2345678901235E+18
    {{#expr:123456789.0123456789}} 123456789.01235
    e作為
    子表達式
    0 數學常數e exp(1) 浮點數 不適用
    {{#expr:e}} 2.718281828459
    pi 0 數學常數圓周率 π pi 浮點數 不適用
    {{#expr:pi}} 3.1415926535898

    错误

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

    • 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:零除错误;
    • In sqrt: Result is not a number:計算結果為虛數。
    • Invalid argument for "$1": "$2":超出"$1"的定義域。

    错误的样例

    • {{#expr: ---...---1}}(110个“-”) = 表达式错误:堆栈耗尽。
    • {{#expr: ( ) 1}} = 表达式错误:未预料的数字。
    • {{#expr: 2 d 1}} = 表达式错误:无法识别的词语“d”。
    • {{#expr: * 1}} = 表达式错误:未预料的*操作符。
    • {{#expr: -}} = 表达式错误:缺少-的操作数。
    • {{#expr: ( 1 ) )}} = 表达式错误:未预料的反括号。
    • {{#expr: 壹}} = 表达式错误:无法识别的符号“壹”。
    • {{#expr: ( 1}} = 表达式错误:未封闭的括号。
    • {{#expr: 1 / 0}} = 零除。
    • {{#expr:sqrt-1}} = 在sqrt中:结果不是数字。
    • {{#expr:ln0}} = ln的无效参数:<= 0。
    • {{#expr:asin-22}} = asin的无效参数:< -1 或 > 1。

    误差

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

    注意内部数字表示

    • {{#expr: 100000000000000000}} = 1.0E+17
    • {{#expr: {{#expr: 100000000000000000}}}} = 1.0E+17
    • {{#expr: (-1.5-0.5 round 0)+2}} = 0
    • {{#expr: -0.1 round 0}} = -0
    • {{#expr: 2017.5000 round 3}} = 2017.5:使用時會有無法補零的情形。欲補零,可以使用{{Round}}模板來解決

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

    参见

    1. ^ 1.0 1.1 div and mod are different from all programming languages, see phab:T8068