Help:计算

维基百科使用手册

借助于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