模板:进制
本模板使用 Lua 语言: |
本模板可将任意数字转成其他进制,只要输入进制与输出进制的底数皆为整数,能转换的数字范围无上限(使用大数运算),与Module:BaseConvert不同,本模板接受非整数的底数,其输出可以为任何底数为绝对值介于1到9007199254740900之间(含)的正实数、负整数、部分的纯虚数和高斯整数的进制。若转换进制的底数非整数,则能转的数字有限,此时输入数必须介于±9007199254740900之间。
- (※)注意请勿使用Module:BaseConvert替代!会导致有使用非整数底数或其他特殊底数的条目全数显示错误内容!
使用方法
第一参数为底数、第二参数为要转换进制的数。
{{进制 | 底数 | 10进制的数字}}
{{进制 | 底数 | k进制的数字 | from=k}}
{{进制 | 底数 | 10进制的数字 | sub=x}}
{{进制 | 底数 | 10进制的数字 | 位数 | sub=x}}
{{进制 | 底数 | k进制的数字 | from=k | 位数 | sub=x}}
引数
引数 | 内容 | 默认值 | 说明 |
---|---|---|---|
1 | 底数 | 无 | 进制的底。可接受任意绝对值介于1到9007199254740900之间(含)的正实数、负整数、平方为整数的纯虚数和高斯整数。 支援特殊进制: ! 表示阶乘进制、fibcode 表示斐波那契编码。
|
2 | 输入的数字 | 无 | 要转换的数。 |
3 | 位数 | 1 | 最低数量的数字显示,达不到时会加“0”。 |
from | 输入之数的底数 | 10 | 若输入的数不是10进制的数字,可在此参数填入输入之数的底数。 可取绝对值小于9007199254740900(含)的任意复数,或特殊进制( ! 、fibcode 等)
|
to | 要转换到的底数 | 无 | 同第一参数。 |
precision | 小数位数 | 0 | 小数点后的位数,达不到时会加“0”。不填该项会显示所有位数,但不超过20位数;若输出底数为整数,则至转换完毕为止,如遇除不尽的情况则最多输出输入小数位数的两倍位数。 |
sub | 显示底数 | 无 | 底数显示样式。见#sub的值一节 |
prefix | 前缀 | 无 | 加在输出值前的维基代码。要转换的数为空时则不加。例如在转换到十六进制后在前面加上0x 。
|
suffix | 后缀 | 无 | 加在输出值后的维基代码。要转换的数为空时则不加。 |
default | 默认 | 无 | 输入数字为空或模板出错时所输出的值,默认为空。 |
error | 显示错误讯息 | no | 布林值,表示当模板出错时,是否要显示错误讯息。 |
sub的值
|sub= |
内容 | 说明 |
---|---|---|
0 | 无 | 不显示底数 |
1 | 标准 | 用A(b)的形式呈现 |
2 | 括号 | 原数加括号、底数不加括号 |
3 | 条目连结 | 标准形式并附上有关进制的条目连结 |
4 | 底数标示不加括号 | 用Ab的形式呈现,即底数不加括号 |
5 | 模式4加条目连结 | 用Ab的形式呈现并附上有关进制的条目连结 |
6 | 位数下标底数 | 每个位数都下标底数(表示该位逢几进位),用于呈现混合底数进制 |
6~11 | 同0-5 | 与模式0-5相同,但采用6的模式:每个位数都下标底数 |
12 | 位数下标位置底数 | 类似模式6,但下标的数可直接与位数相乘得到该位的值 |
<其他> | 空 | 视为没输入,预设为不显示底数 |
支援进制
目前支援的进制有:
n
整数底数进制:支援一般的进制,如2
=二进制、8
=八进制、16
=十六进制、60
=六十进制等;也支援负底数进制n.m
正非整数进位制:支援底数有小数点的进制±n±mi
复底数进制:支援高斯整数底数的进制,如2i
=2i进制。纯虚数底数支援正纯虚数和负纯虚数底数的进制,但底数的平方要是整数,可以转换小数及分数;其馀高斯整数底数的进制只能转换高斯整数,且可能会遇到无法支援的情况(部分高斯整数在某些底数之下需要使用小数来表示,而高斯整数进制只支持整数表示)。!
阶乘进制:各个位数间以:
分隔的阶乘进制!0
阶乘进制:以0-9、A-Z表示的阶乘进制!-
阶乘进制:以0-9、A-Z表示的阶乘进制,并省略个位数#
质数阶乘进制fib
斐波那契进制fibcode
斐波那契编码- 连分数:仅会转换小数部分(使用了大数倒数运算,位数越多会越费时)
...b3,b2,b1,b0
混合底数进制:例如7,24,60,60;1000
表示个位数底数为60、第2位数底数为60、第3位数底数为24、第4位数底数为7、小数第一位数底数为1000,为常见的时间表达方式(7周,24小时,60分钟,60秒;1000毫秒)。最末两个字元如果不是数字则倒数第二个字表示位数分隔符号、最后一个字表示小数点,如5,4,3:;
代表位数分隔符号为:
、小数点为;
。若小数点与位数分隔符号皆为点.
则代表无位数分隔符号并以0-9、A-Z表示各个位数。
范例
{{进制 | 10 | 12345 | 8}}
= 00012345(作为数字补零模板。){{进制 | 10 | 0.12345 | precision=8}}
= 0.12345000(小数点后补零。){{进制 | 10 | 0.12345 | 8 | precision=8}}
= 00000000.12345000(两侧补零。){{进制 | 2 | 12345 | sub=1}}
= 11000000111001(2){{进制 | 8 | 12345 | 3}}
= 30071 (输出结果超过指定位数不补零){{进制 | 16 | -12345}}
= −3039{{进制 | 20 | -12345 | 6 | sub=2}}
= (−001AH5)20{{进制 | 16 | 1AH5 | from=20}}
= 3039 (从20进制转成16进制){{进制 | 10 | 0x3039 }}
= 12345 (16进制的表达方式){{进制 | 10 | 9007199254740991}}
= 9007199254740991{{进制 | 10 | 9007199254740991 | 20}}
= 00009007199254740991(作为数字补零模板。){{进制 | 16 | 900719925474099200012345.125}}
= BEBC2000000000003039.2(大数运算。){{Hexadecimal | 900719925474099200012345.125 | no}}
= Template:Hexadecimal(对比不支援大数运算的模板){{进制 | 36 | 91730738691298.687842955 | precision=3}}
= WIKIPEDIA.ORG{{进制 | 2.71828182845904523536 | 3.14159265358979323846}}
= 10.10100202000211112002(OEIS中的数列A050948)(圆周率转换为e进制,非整数进制){{进制 | 60 | 3.14159265358979323846 | precision=8}}
= 3;8,29,44,0,47,25,53,7(OEIS中的数列A060707)(圆周率转换为六十进制){{进制 | 10 | 3;8,29,44,0,47,25,53,7,24,57,36,17 | from=60}}
= 3.141592653589793238462(六十进制转回十进制){{进制 | −10 | −8,163 | sub=1}}
= 9977(−10)(负底数进制){{进制 | 10 | 9977 | from=−10}}
= −8163{{进制 | ! | 463 | sub=1}}
= 3:4:1:0:1:0(!)(阶乘进制){{进制 | ! | 463 | sub=12}}
= 354413021100(阶乘进制并显示每个位数的底数){{进制 | 1 | 20}}
= 11111111111111111111(一进制){{进制 | 2.5 | 12}}
= 120.12010100100210110101(正非整数进位制){{进制 | 3 | 321 | sub=3}}
= 102220(3){{进制 | 2 | 1024 | 10 | sub=A}}
= 10000000000 (sub参数错误){{进制 | 10 | 你}}
= 20320(若输入的字符不是0~9、A-Z则会以字码值来计算)U+
= U+4F60{{进制 | 16 | 你}}
底数超过36的进制
底数超过36的进制由于数字0-9及字母A-Z已用尽,因此会采用以下格式表达:[1]
d3,d2,d1,d0;d-1,d-2,d-3
以分号;
当作小数点,其中;
前方为整数部分、;
后方为小数部分。
对于输入值而言,其关键的判断条件是字串中是否存在分号;
,因此若输入的数值为整数请在末尾加上分号,否则仅会视为数字分位。
{{进制 | 60 | 12345}}
= 3,25,45{{进制 | 10 | 3,25,45 | from=60}}
= 39330245(逗点被视为数字分位,因此解析成[3][2][5][4][5]60){{进制 | 10 | 3,25,45; | from=60}}
= 12345(加上分号;
以顺利读取成[3][25][45]60){{进制 | 10 |
= 12345(底数超过36的进制安全的互转方式就是字尾都加上分号){{进制 | 60 | 12345}}
; | from=60}}
运用这个特性也可以透过转换成一千进制将十进制的整数输出为数字分位的格式:
{{进制 | 1000 | 12345678}}
= 12,345,687
若需要修改数字分隔符号,可以使用混合底数的分隔符号语法来完成,例如将六十进制的60
改成60,60:.
即可将分隔符号切换成:
,例如:
此外,阶乘进制到了36位数之后也会遇到数字0-9及字母A-Z已用尽的情况,因此阶乘进制预设是以以下格式表达:
d3:d2:d1:d0.d-1:d-2:d-3
以点.
当作小数点,其中.
前方为整数部分、.
后方为小数部分。
与上述底数超过36的进制不同,其对于输入值而言,其关键的判断条件是字串中是否存在冒号:
,因此无须额外添加其他符号即可读取。
{{进制 | ! | 39812345}}
= 10:9:6:3:1:5:2:2:2:1:0{{进制 | 10 | 10:9:6:3:1:5:2:2:2:1:0 | from=!}}
= 39812345{{进制 | 10 |
= 39812345{{进制 | ! | 39812345}}
| from=!}}
阶乘进制有时会省略个位数,因为恒为零。对于有小数点的结果可套用以下语法:
{{replace |
= Template:Replace(将个位数替换掉){{进制 | ! |
| :0. | .}}{{计算 | e}}
| precision=15}}{{进制 | ! |
= 1:0:0.0:1:1:1:1:1:1:1:1:1:1:1:1:1:1{{计算 | e}}
| precision=15}}{{进制 | 10 |
= 2.718281828459{{计算 | e}}
}}
另一方面,阶乘进制也可以改成输入!0
来使用数字0-9及字母A-Z表达,惟须注意超过36位数之后可能会出现乱码或小写字母(小写字母和大写字母视为相同,将导致结果无法转回原进制)。
{{进制 | !0 | 12345}}
= 23041110{{进制 | 10 | 23041110 | from=!}}
= 12345{{进制 | !0 | 123456789012345}}
= 5E61C894452041110{{replace |
= Template:Replace(将个位数替换掉){{进制 | !0 |
| 0. | .}}{{计算 | e}}
| precision=15}}{{进制 | !0 |
= 100.011111111111111{{计算 | e}}
| precision=15}}
虚数模式
当输入底数(from)和输出底数(to)有一者为虚数或两者皆为虚数时,会进入虚数模式。一般情况下,符号“i”会被视为数值18,且数字中间的加减号会被忽略,而若进入虚数模式,则末尾的小写i会被视为虚数单位,且数字中间的加减号会被视为表达式的项。在这个模式下可以转换以虚数为底的进制,如2i进制。
{{进制 | 2i | 7}}
= 10303{{进制 | 2i | 6i}}
= 30{{进制 | 2i | 35+23i}}
= 121003.2{{进制 | 10 | 121003.2 | from=2i}}
= 35+23i{{进制 | 2i | 5i+5}}
= 10331.2{{进制 | 10 | 5i+5}}
= 685(并未进入虚数模式,“i”被视为数值18、加号被忽略){{进制 | 6i | 52846533.25−4901799.925926i | precision=3}}
= WIKIPEDIA.ORG{{进制 | 10i | 97049309−19605920i}}
= 123456789
本模板也能转换高斯整数底数的进制,但高斯整数底数的进制只能转换高斯整数不支援小数或分数的输入。部分高斯整数底数可能会遇到无法顺利转换的情况,例如i无法在2+3i底数的进制中以整数表示。
混合底数
混合底数进制的输入方式为...,
,其中 base3, base2, base1, base0; base-1, base-2, base-3, base-4, ...;
为小数点。混合底数的各个底数仅能为正整数。
- 例如
∞,7,24,60;60,1000
为个位数逢60进位、第2位数逢24进位、第3位数逢7进位、第4位数后不再进位;小数第一位逢60进位、小数第二位逢1000进位。
末2个字元如果不是数字则是用来指定数字分隔符号以及小数点符号。
- 例如
∞,7,24,60,60:;
表示数字分隔符号为:
、小数点符号为;
。
{{进制 | ∞,7,24,60,60 | 3347517}}
= 5,3,17,51,57(表示5周3天17时51分57秒的秒数){{进制 | ∞,7,24,60,60:; | 3347517}}
= 5:3:17:51:57(改变数字分隔和小数点的符号){{进制 | ∞,7,24,60,60 | 3347517 | sub=6}}
= 5∞37172451605760(标示该位是逢几进位){{进制 | 10 | 12:5:13:30:00 | from=∞,7,24,60,60}}
= 7738200(可用来计算指定时间的秒数,例如本例为12周5天13时30分所经过的秒数){{进制 | ∞,7,24,60;60,1000 | 330225.255}}
= 32,5,7,45;15,300(也可以以分钟为单位;表示32周5天7时45分15秒300毫秒的分钟数){{进制 | 10 | 32,5,7,45;15,300 | from=∞,7,24,60;60,1000}}
= 330225.255(相反,也可以用来计算指定时间的分钟数){{进制 | 9,8,7,6,5,4,3,2,1 | 12345}}
= 23041110(模拟阶乘进制){{进制 | ! | 12345 }}
= 2:3:0:4:1:1:1:0{{进制 | 9,8,7,6,5,4,3,2,1 | 12345.12 | precision=9 | sub=6}}
= 2837064514131201.010203244526276839(小数点后为给定的底数镜像顺序){{进制 | 10,8,6 | 12345}}
= 25713(若进位到了范围外,则取最外的底数,如10,8,6
即...10,10,10,10,8,6
){{进制 | 10,8,6 | 12345 | sub=6}}
= 2105107101836{{进制 | 0,5,2 | 12345}}
= 110112021(最前面是零代表循环,0,5,2
即...5,2,5,2,5,2
){{进制 | 0,5,2 | 12345 | sub=6}}
= 121502151225022512{{进制 | 10 | 110112021 | from=0,5,2}}
= 12345{{进制 | 0,5,2 | 12345.54321 | sub=6}}
= 121502151225022512.25122502151215020512(循环包含小数)
错误用法
{{进制}}
= (甚么都没有输入是未定义行为){{进制 | default=转换失败}}
= 转换失败{{进制 | 2}}
= (只输入底数没有输入其他内容也是未定义行为){{进制 | 2 | default=转换失败}}
= 转换失败{{进制 | ∞ | 12345}}
= 12345(无限大进制等于永远不会进位因此原数输出){{进制 | 10 | 0,12345 | from=∞}}
= 12345{{进制 | 10 | 12345,12345 | from=∞}}
= ∞(两个位数的无限大进制第二个位数的位数值为正无穷,故结果没有意义){{进制 | 10 | 12345,12345 | from=∞ | error=yes}}
= mw.lua第527行Lua错误:底数不能为 '∞'{{进制 | NaN | 12345}}
= (无法转换时预设不输出){{进制 | NaN | 12345 | default=转换失败}}
= 转换失败{{进制 | NaN | 12345 | error=yes}}
= mw.lua第527行Lua错误:'NaN' 不是有效的底数{{进制 |
={{#expr:sqrt(-1)}}
| 12345}}{{进制 | 十六 | 12345 }}
= (不支援中文数字){{进制 | 十六 | 12345 | error=yes}}
= mw.lua第527行Lua错误:'十六' 不是有效的底数{{进制 | 3,-2 | 12345}}
= (混合底数不接受包含负值的底数){{进制 | 3,-2 | 12345 | error=yes}}
= mw.lua第527行Lua错误:不支援非正整数的混合底数 '3,-2' 进制{{进制 | 3,2.5 | 12345}}
= (混合底数不接受包含非整数的底数){{进制 | 3,2;∞ | 123.45}}
= 2,0,2,1,1;∞(底数是无穷大时无法呈现小数){{进制 | 1 | 1e+17 | error=yes}}
= mw.lua第527行Lua错误:无法将 '1e+17' 转换为底数 '1' 的进制{{进制 | 2i | i~2 | error=yes}}
= mw.lua第527行Lua错误:'i~2' 不是有效的数字(虚数模式下必须确保输入的数是有效的复数){{进制 | 2i+3 | 2.5 | error=yes}}
= mw.lua第527行Lua错误:底数 '2i+3' 不支援非高斯整数 '2.5' 的转换{{进制 | 1e+17 | 10 | error=yes}}
= mw.lua第527行Lua错误:底数 '1e+17' 过大(过大的底数因运算精度问题不予计算){{进制 | 0.5 | 10 | error=yes}}
= mw.lua第527行Lua错误:底数的绝对值不能小于1{{进制 | -2.5 | 10 | error=yes}}
= mw.lua第527行Lua错误:不支援底数 '-2.5' 的进制
使用限制
- 若输入进制的底数为正整数、输出进制的底数为正或负的整数,则转换的数字范围没有上限,任意大的数、任何长度的小数位数都能正常转换
- 若输入进制的底数为负数且输入的数字为整数,则能转换的数字范围介于±9007199254740991之间
- 若输入进制的底数为负数且输入的数字不为整数,或输入、输出的任一底数为非整数,无论输入的数是否为整数,则能转换的范围受限于浮点数的精度限制,约十进制14位有效数字。
- 所有转换都受限于WP:模板限制:虽然上述有部分是无理论转换上限的,但过多的位数可能会超出WP:模板限制
进制的转换范围
来源进制 | 目标进制 | 范围 |
---|---|---|
正整数底数进制 | 正整数底数进制 | 任何实数(不限大小) |
一进制 负一进制 |
±1048576范围内(见WP:模板限制,以及测试) | |
负底数进制 (底数仅限整数) |
任何实数(不限大小) | |
正非整数进位制 | 受限于浮点数精度(十进制14位有效数字) | |
阶乘进制 | 任何实数(不限大小) | |
斐波那契编码 | 小于9007199254740991的正整数 | |
正非整数进位制 | 正整数底数进制 | 受限于浮点数精度(十进制14位有效数字) |
负底数进制 (底数仅限整数) | ||
正非整数进位制 | ||
阶乘进制 | ||
斐波那契编码 | 小于9007199254740991的正整数 | |
负底数进制 (底数仅限整数) |
正整数底数进制 | ±9007199254740991范围内 |
负底数进制 (底数仅限整数) | ||
正非整数进位制 | ||
阶乘进制 | ||
斐波那契编码 | 小于9007199254740991的正整数 | |
任何底数 | 纯虚数底数进制 | 14位数以内的任何复数 |
高斯整数底数进制 | 14位数以内的高斯整数 |
模板数据
进制
用来把数字转换成底数为绝对值大于1的正实数、负整数和高斯整数之间的任何进位制
参数 | 描述 | 类型 | 状态 | |
---|---|---|---|---|
目标底数 | 1 to base | 目标进位制的底数
| 数字 | 可选 |
数字 | 2 number num n | 须转换的数字 | 字符串 | 必需 |
位数补齐 | 3 width | 小数点前至少显示的位数,达不到时会加“0”。
| 数字 | 可选 |
原始底数 | from | 输入值的进位制,默认为10(如果输入值以“0x”开头,则默认为16)。
| 数字 | 可选 |
小数计算最大位数 | precision | 小数点后的位数,达不到时会加“0”。不填该项会显示所有位数,但不超过20位数。
| 数字 | 可选 |
输出模式 | sub | 输出的模式。可填入0、1、2、4或5。不填则预设为0。1为标准格式,以括弧下标标示底数;2为原数加括弧下标标示底数;3为基于标准格式加上数字及进位制的内部连结;4为下标标示底数不加括弧;5为基于4的格式加上数字及进位制的内部连结 | 数字 | 可选 |
前缀 | prefix | 加在输出值前的维基代码。例如在转换到十六进制后在前面加上0x | 内容 | 可选 |
后缀 | suffix | 加在输出值后的维基代码 | 内容 | 可选 |
默认值 | default | 输入数字为空或模板出错时所输出的值,默认为空。 | 内容 | 可选 |
显示错误讯息 | error | 当模板出错时,是否要显示错误讯息。 | 布尔 | 可选 |
参见
- {{进制/模板}}:仅能转换2-36整数底数进位的模板,纯粹由模板语法及parser function写成,为本模板的旧版本
- Module:BaseConvert:仅能转换2-36整数底数进位的Lua模组
- 进位制
参考文献
- ↑ Kennedy, E. S., Abu-r-Raihan al-Biruni, 973-1048, Journal for the History of Astronomy: 65, Bibcode:1978JHA.....9...65K, doi:10.1177/002182867800900106、Aaboe, Asger, Episodes from the Early History of Mathematics, New Mathematical Library 13, 纽约: Random House: 125, 1964 [2017-12-08], (原始内容存档于2017-02-01)
- ↑ William J. Gilbert. Arithmetic in Complex Bases (PDF). Mathematics Magazine. 1984-03,. Vol. 57 (No. 2).
上述文档嵌入自Template:进制/doc。 (编辑 | 历史) 编者可以在本模板的沙盒 (创建 | 镜像)和测试样例 (创建)页面进行实验。 请在/doc子页面中添加分类。本模板的子页面。 |