借助于Mediawiki的扩展“函数解析器”,进行计算变得可行。
注意:目前此功能还有bug,详情见meta:Talk:ParserFunctions#Bugs 。
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
unary - sign (負號)
-
與參數相同
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
rounds off the number on the left to a multiple of 1/10 raised to a power, with the exponent equal to the truncated value of the number given on the right
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”。
错误
此函数进行错误检查并给出信息。
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.0 1.1 div
and mod
are different from all programming languages, see phab:T8068