Help:计算

维基百科使用手册

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

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

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

{{#expr: 表达式 }}

表达式支持的运算符有:

运算符名称优先级元数结合性样例
+91{{#expr: + 7}} = 7
-91{{#expr: - 7}} = -7
not逻辑非91{{#expr: not 7}} = 0
*82{{#expr: 30 * 7}} = 210
/82{{#expr: 30 / 7}} = 4.2857142857143
div82{{#expr: 30 div 7}} = 4.2857142857143
mod82{{#expr: 30 mod 7}} = 2
+62{{#expr: 30 + 7}} = 37
-62{{#expr: 30 - 7}} = 23
round舍入52{{#expr: 30 / 7 round 7}} = 4.2857143
=等于42{{#expr: 30 = 7}} = 0
<小于42{{#expr: 30 < 7}} = 0
>大于42{{#expr: 30 > 7}} = 1
<=小于等于42{{#expr: 30 <= 7}} = 0
>=大于等于42{{#expr: 30 >= 7}} = 1
<>不等于42{{#expr: 30 <> 7}} = 1
!=不等于42{{#expr: 30 != 7}} = 1
and逻辑与32{{#expr: 30 and 7}} = 1
or逻辑或22{{#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}}表达式错误:预期外的数字。
exp1自然指數函數 exexp浮點數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
ln1自然對數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
abs1絕對值abs同於輸入值,並且非負9
{{#expr:abs-2}}2
{{#expr:abs trunc-2}}2
{{#expr:abs trunc-2^63}}9.2233720368548E+18
sqrt1平方根sqrt浮點數9
{{#expr:sqrt 4}}2
{{#expr:sqrt 2}}1.4142135623731
{{#expr:sqrt 1e19}}3162277660.1684

此平方根計算無法處理結果為虛數複數的情況,
計負值的平方根會出錯:

{{#expr:sqrt-1}}sqrt内:结果不是数字。
trunc1截尾函數(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
floor1向下取整函数floor浮點數9
{{#expr:floor1.2}}1
{{#expr:floor-1.2}}-2
{{#expr:floor trunc3}}3
ceil1向上取整函数ceil浮點數9
{{#expr:ceil1.2}}2
{{#expr:ceil-1.2}}-1
{{#expr:ceil trunc3}}3
sin1正弦函數sin浮點數9
{{#expr:sin.1}}0.099833416646828
{{#expr:sin trunc1}}0.8414709848079

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

{{#expr:sin(30*pi/180)}}0.5
cos1餘弦函數cos浮點數9
{{#expr:cos.1}}0.99500416527803
{{#expr:cos trunc1}}0.54030230586814
tan1正切函數tan浮點數9
{{#expr:tan.1}}0.10033467208545
{{#expr:tan trunc1}}1.5574077246549
asin1反正弦asin浮點數9
{{#expr:asin.1}}0.10016742116156
{{#expr:asin trunc1}}1.5707963267949
acos1反餘弦acos浮點數9
{{#expr:acos.1}}1.4706289056333
{{#expr:acos trunc1}}0
{{#expr:2*acos 0}}3.1415926535898
atan1反正切atan浮點數9
{{#expr:atan.1}}0.099668652491162
{{#expr:atan trunc1}}0.78539816339745
{{#expr:4*atan 1}}3.1415926535898
not1逻辑非!以整數表達
布林值
(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
/ (或寫作div2除法
(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
mod2模除。 實行帶餘除法
時會將前後兩數截
成整數。[1]
%整數7
{{#expr:30mod7}}2
{{#expr:-30mod7}}-2
{{#expr:30mod-7}}2
{{#expr:-30mod-7}}-2
{{#expr:30.5mod7.9}}2

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

{{#expr:123mod2^64}}除以零。
fmod2模除,浮點數版本。
返回減去第二參數之整數
倍的第一參數。
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
round2將指定的小數位數
四捨五入,若為
負值則會對指數
為數做四捨五入。
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
and2逻辑与&&以整數表達
布林值
(1 或 0)
3
{{#expr:3and4}}1
{{#expr:-3and0}}0
{{#expr:0and4}}0
{{#expr:0and0}}0
or2逻辑或||以整數表達
布林值
(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數學常數eexp(1)浮點數不適用
{{#expr:e}}2.718281828459
pi0數學常數圓周率 π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