单位 #
Math.js 支持单位。单位可用于执行计算和转换。
用法 #
可以使用函数 math.unit 创建单位。此函数接受一个包含值和单位的字符串参数,或两个参数,第一个为数值,第二个为包含单位的字符串。大多数单位支持前缀,例如 k 或 kilo,许多单位既有全名也有缩写。返回的对象是一个 Unit。
语法
math.unit(value: number, valuelessUnit: string) : Unit
math.unit(value: number, valuelessUnit: Unit) : Unit
math.unit(unit: string) : Unit
math.unit(unit: Unit) : Unit
示例用法
const a = math.unit(45, 'cm') // Unit 450 mm
const b = math.unit('0.1 kilogram') // Unit 100 gram
const c = math.unit('2 inch') // Unit 2 inch
const d = math.unit('90 km/h') // Unit 90 km/h
const e = math.unit('101325 kg/(m s^2)') // Unit 101325 kg / (m s^2)
const f = c.to('cm') // Unit 5.08 cm
b.toNumber('gram') // Number 100
math.number(b, 'gram') // Number 100
c.equals(a) // false
c.equals(f) // true
c.equalBase(a) // true
c.equalBase(b) // false
f.toString() // String "5.08 cm"
const kph = math.unit('km/h') // valueless Unit km/h
const mps = math.unit('m/s') // valueless Unit m/s
const speed = math.unit(36, kph) // Unit 36 km/h
speed.toNumber(mps) // Number 10
在创建带有多个分母项的单位时要小心。隐式乘法与显式乘法和除法的运算符优先级相同,这意味着这三个表达式是相同的
// These three are identical
const correct1 = math.unit('8.314 m^3 Pa / mol / K') // Unit 8.314 (m^3 Pa) / (mol K)
const correct2 = math.unit('8.314 (m^3 Pa) / (mol K)') // Unit 8.314 (m^3 Pa) / (mol K)
const correct3 = math.unit('8.314 (m^3 * Pa) / (mol * K)') // Unit 8.314 (m^3 Pa) / (mol K)
但此表达式省略了 mol 和 K 之间的第二个 /,导致结果错误
// Missing the second '/' between 'mol' and 'K'
const incorrect = math.unit('8.314 m^3 Pa / mol K') // Unit 8.314 (m^3 Pa K) / mol
函数 math.unit 有自己的小型解析器。此解析器与表达式解析器 math.evaluate 有点不同,在此情况下返回预期的结果
// using math.evaluate instead of math.unit
const correct4 = math.evaluate('8.314 (m^3 * Pa) / (mol * K)') // Unit 8.314 (m^3 Pa) / (mol K)
总之:注意隐式乘法。如有疑问,请始终使用显式的 * 和括号。
计算 #
支持单位的操作包括 add、subtract、multiply、divide、pow、abs、sqrt、square、cube 和 sign。当参数是角度时,也支持三角函数,例如 cos。
const a = math.unit(45, 'cm') // Unit 450 mm
const b = math.unit('0.1m') // Unit 100 mm
math.add(a, b) // Unit 0.55 m
math.multiply(b, 2) // Unit 200 mm
const c = math.unit(45, 'deg') // Unit 45 deg
math.cos(c) // Number 0.7071067811865476
// Kinetic energy of average sedan on highway
const d = math.unit('80 mi/h') // Unit 80 mi/h
const e = math.unit('2 tonne') // Unit 2 tonne
const f = math.multiply(0.5, math.multipy(math.pow(d, 2), e))
// 1.2790064742399996 MJ
也支持对数组进行操作
// Force on a charged particle moving through a magnetic field
const B = math.evaluate('[1, 0, 0] T') // [1 T, 0 T, 0 T]
const v = math.evaluate('[0, 1, 0] m/s') // [0 m / s, 1 m / s, 0 m / s]
const q = math.evaluate('1 C') // 1 C
const F = math.multiply(q, math.cross(v, B)) // [0 N, 0 N, -1 N]
所有算术运算符都作用于单位在 SI 单位中表示的值。在处理像 celsius(或 degC)和 fahrenheit(或 degF)这样的温度刻度时,这可能会导致意外的行为。通常,应避免使用 celsius 和 fahrenheit 进行计算。而应使用 kelvin(或 K)和 rankine(或 degR)。此示例重点介绍了在使用 celsius 和 fahrenheit 进行计算时的一些问题
const T_14F = math.unit('14 degF') // Unit 14 degF (263.15 K)
const T_28F = math.multiply(T_14F, 2) // Unit 28 degF (270.93 K), not 526.3 K
const Tnegative = math.unit(-13, 'degF') // Unit -13 degF (248.15 K)
const Tpositive = math.abs(Tnegative) // Unit -13 degF (248.15 K), not 13 degF
表达式解析器也支持单位。这在 语法 页面的单位部分进行了描述。
用户定义单位 #
您可以使用 math.createUnit 函数添加自己的单位到 Math.js。以下示例定义了一个新单位 furlong,然后在一个计算中使用用户定义的单位
math.createUnit('furlong', '220 yards')
math.evaluate('1 mile to furlong') // 8 furlong
如果您无法用任何现有单位来表达新单位,则可以省略第二个参数。在这种情况下,会创建一个新的基本单位
// A 'foo' cannot be expressed in terms of any other unit.
math.createUnit('foo')
math.evaluate('8 foo * 4 feet') // 32 foo feet
createUnit 的第二个参数也可以是一个配置对象,由以下属性组成
- definition 一个
string或Unit,它定义了用户定义的单位相对于现有内置单位或用户定义的单位。如果省略,则创建一个新的基本单位。 - prefixes 一个
string,指示 math.js 应与新单位一起使用的前缀。可能的值为'none'、'short'、'long'、'binary_short'或'binary_long'。默认值为'none'。 - offset 在转换为单位时应用的值。这对于不与绝对温度刻度共享零点的温度刻度非常有用。例如,如果我们首次定义华氏度,我们会使用:
math.createUnit('fahrenheit', {definition: '0.555556 kelvin', offset: 459.67}) - aliases 一个字符串数组,用于为新单位创建别名。例如:
math.createUnit('knot', {definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts']}) - baseName 一个
string,用于指定新维度的名称(以防需要创建)。Math.js 中的每个单位都有一个维度:长度、时间、速度等。如果单位的definition不匹配任何现有维度,或者它是一个新的基本单位,那么createUnit将创建一个名为baseName的新维度并将其分配给新单位。默认是附加'_STUFF'到单位的名称。如果单位已匹配现有维度,则此选项无效。
也可以将一个可选的 options 对象作为最后一个参数传递给 createUnits。目前只支持 override 选项
// Redefine the mile (would not be the first time in history)
math.createUnit('mile', '1609.347218694 m', {override: true})
未指定定义创建的基本单位无法被覆盖。
一次创建多个单位 #
可以通过一次调用 createUnit 来定义多个单位,方法是传递一个对象映射作为第一个参数,其中对象的每个键是新单位的名称,值是要么定义单位的字符串,要么是具有上述配置属性的对象。如果值为空字符串或缺少 definition 属性的对象,则创建一个新的基本单位。
例如
math.createUnit( {
foo: {
prefixes: 'long',
baseName: 'essence-of-foo'
},
bar: '40 foo',
baz: {
definition: '1 bar/hour',
prefixes: 'long'
}
},
{
override: true
})
math.evaluate('50000 kilofoo/s') // 4.5 gigabaz
返回值 #
createUnit 返回创建的单位,或者在创建多个单位时,返回最后一个创建的单位。由于 createUnit 也兼容表达式解析器,因此您可以执行类似的操作
math.evaluate('45 mile/hour to createUnit("knot", "0.514444m/s")')
// 39.103964668651976 knot
支持单位名称中的自定义字符 #
默认情况下,新单位的名称
- 必须以拉丁字母(A-Z 或 a-z)开头
- 只能包含数字(0-9)或拉丁字符
可以通过覆盖 Unit.isValidAlpha 静态方法来允许使用特殊字符(例如希腊字母、西里尔字母、任何 Unicode 符号等)。例如
const isAlphaOriginal = math.Unit.isValidAlpha
const isGreekLowercaseChar = function (c) {
const charCode = c.charCodeAt(0)
return charCode > 944 && charCode < 970
}
math.Unit.isValidAlpha = function (c) {
return isAlphaOriginal(c) || isGreekLowercaseChar(c)
}
math.createUnit('θ', '1 rad')
math.evaluate('1θ + 3 deg').toNumber('deg') // 60.29577951308232
单位值的数值类型 #
内置单位始终以 number 作为其值创建。要将值转换为例如 BigNumber 或 Fraction,可以使用函数 math.fraction 和 math.bignumber 进行转换
math.unit(math.fraction(10), 'inch').toNumeric('cm') // Fraction 127/5
math.fraction(math.unit(10, 'inch')).toNumeric('cm') // Fraction 127/5
math.bignumber(math.unit(10, 'inch')).toNumeric('cm') // BigNumber 25.4
math.unit(math.bignumber(10), 'inch').toNumeric('cm') // BigNumber 25.4
在使用表达式解析器时,可以将数值解析为 Fraction 或 BigNumber
math.config({ number: 'Fraction' })
math.evaluate('10 inch').toNumeric('cm') // Fraction 127/5
API #
Unit 对象包含以下函数
unit.clone() #
克隆单位,返回具有相同参数的新单位。
unit.equalBase(unit) #
测试一个单位是否与其他单位具有相同的基本单位:长度、质量等。
unit.equals(unit) #
测试一个单位是否等于另一个单位。当单位具有相同的基本单位并且在标准化为 SI 单位后值相同时,它们被认为是相等的。
unit.format([options]) #
获取单位的字符串表示。该函数将确定最适合单位的前缀。有关可用选项,请参阅 Format 页面。
unit.toBest(unitList, options) #
将单位转换为最合适的显示单位,方法是从提供的单位列表(unitList)中选择,如果没有提供列表,则自动选择。它还接受选项。目前,唯一可用的选项是 offset,用于更好的前缀计算
unit.fromJSON(json) #
从 JSON 对象恢复单位。接受一个对象 {mathjs: 'Unit', value: number, unit: string, fixPrefix: boolean},其中 mathjs 和 fixPrefix 属性是可选的。用于反序列化单位,请参阅 Serialization。
unit.splitUnit(parts) #
将单位分割成指定的几部分。例如
const u = math.unit(1, 'm')
u.splitUnit(['ft', 'in']) // 3 feet,3.3700787401574765 inch
unit.to(unitName) #
将单位转换为指定的单位名称。返回一个具有固定前缀和单位的单位副本。
unit.toJSON() #
返回单位的 JSON 表示,签名是 {mathjs: 'Unit', value: number, unit: string, fixPrefix: boolean}。用于序列化单位,请参阅 Serialization。
unit.toNumber(unitName) #
获取单位转换为指定单位(带可选前缀但不带值的单位)时的值。返回值的类型始终为 number。
unit.toNumeric(unitName) #
获取单位转换为指定单位(带可选前缀但不带值的单位)时的值。返回值的类型取决于单位的创建方式,可以是 number、Fraction 或 BigNumber。
unit.toSI() #
返回一个以 SI 单位表示的单位副本。适用于带值或不带值的单位。
unit.toString() #
获取单位的字符串表示。该函数将确定最适合单位的前缀。
unit.valType() #
获取此 Unit 对象的值的当前类型的字符串名称,例如“number”、“BigNumber”等。
单位参考 #
本节列出了所有可用的单位、前缀和物理常数。这些可以通过 Unit 对象或 math.evaluate() 来使用。
参考 #
Math.js 包含以下内置单位。
| 基本 | 单位 |
|---|---|
| 长度 | 米 (m)、英寸 (in)、英尺 (ft)、码 (yd)、英里 (mi)、链 (li)、杆 (rd)、英尺 (ch)、埃 (angstrom)、密耳 (mil) |
| 表面积 | m2、sqin、sqft、sqyd、sqmi、sqrd、sqch、sqmil、英亩 (acre)、公顷 (hectare) |
| 体积 | m3、升 (l, L, lt, liter)、cc、cuin、cuft、cuyd、茶匙 (teaspoon)、汤匙 (tablespoon) |
| 液体体积 | 最小单位 (minim)、打兰 (fluiddram, fldr)、盎司 (fluidounce, floz)、及耳 (gill, gi)、杯 (cup, cp)、品脱 (pint, pt)、夸脱 (quart, qt)、加仑 (gallon, gal)、啤酒桶 (beerbarrel, bbl)、油桶 (oilbarrel, obl)、大桶 (hogshead)、滴 (drop, gtt) |
| 角度 | 弧度 (rad)、度 (deg)、梯度 (grad)、圈 (cycle)、角秒 (arcsec)、角分 (arcmin) |
| 时间 | 秒 (second, s, secs, seconds)、分钟 (minute, min, mins, minutes)、小时 (hour, h, hr, hrs, hours)、天 (day, days)、周 (week, weeks)、月 (month, months)、年 (year, years)、十年 (decade, decades)、世纪 (century, centuries)、千年 (millennium, millennia) |
| 频率 | 赫兹 (hertz, Hz) |
| 质量 | 克 (gram, g)、吨 (tonne, ton)、格令 (grain, gr)、打兰 (dram, dr)、盎司 (ounce, oz)、磅质量 (poundmass, lbm, lb, lbs)、英担 (hundredweight, cwt)、条 (stick)、斯通 (stone) |
| 电流 | 安培 (ampere, A) |
| 温度 | 开尔文 (kelvin, K)、摄氏度 (celsius, degC)、华氏度 (fahrenheit, degF)、兰氏度 (rankine, degR) |
| 物质的量 | 摩尔 (mole, mol) |
| 发光强度 | 坎德拉 (candela, cd) |
| 力 | 牛顿 (newton, N)、达因 (dyne, dyn)、磅力 (poundforce, lbf)、千磅 (kip) |
| 能量 | 焦耳 (joule, J)、尔格 (erg)、瓦时 (Wh)、英热单位 (BTU)、电子伏特 (electronvolt, eV) |
| 功率 | 瓦特 (watt, W)、马力 (hp) |
| 压力 | 帕斯卡 (Pa)、磅/平方英寸 (psi)、大气压 (atm)、托 (torr)、巴 (bar)、毫米汞柱 (mmHg)、毫米水柱 (mmH2O)、厘米水柱 (cmH2O) |
| 电和磁 | 安培 (ampere, A)、库仑 (coulomb, C)、瓦特 (watt, W)、伏特 (volt, V)、欧姆 (ohm)、法拉 (farad, F)、韦伯 (weber, Wb)、特斯拉 (tesla, T)、亨利 (henry, H)、西门子 (siemens, S)、电子伏特 (electronvolt, eV) |
| 二进制 | 比特 (bits, b)、字节 (bytes, B) |
注意:所有时间单位都基于儒略年,一个月是儒略年的 1/12,一年是儒略年,十年是 10 个儒略年,一个世纪是 100 个,一个千年是 1000 个。
请注意,所有相关单位也可以写成复数形式,例如 5 meters 而不是 5 meter,或者 10 seconds 而不是 10 second。
表面积和体积单位也可以用长度单位的幂次来表示,例如 100 in^2 而不是 100 sqin。
前缀 #
以下十进制前缀可用。
| 名称 | 缩写 | 值 |
|---|---|---|
| 十 | da | 1e1 |
| 百 | h | 1e2 |
| 千 | k | 1e3 |
| 兆 | M | 1e6 |
| 吉 | G | 1e9 |
| 太 | T | 1e12 |
| 拍 | P | 1e15 |
| 艾 | E | 1e18 |
| 泽 | Z | 1e21 |
| 尧 | Y | 1e24 |
| 龙 | R | 1e27 |
| 千 | Q | 1e30 |
| 名称 | 缩写 | 值 |
|---|---|---|
| 分 | d | 1e-1 |
| 厘 | c | 1e-2 |
| 毫 | m | 1e-3 |
| 微 | u | 1e-6 |
| 纳 | n | 1e-9 |
| 皮 | p | 1e-12 |
| 飞 | f | 1e-15 |
| 阿 | a | 1e-18 |
| 仄 | z | 1e-21 |
| 幺 | y | 1e-24 |
| 龙 | r | 1e-27 |
| 屈 | q | 1e-30 |
以下二进制前缀可用。它们可用于 bits(b)和 bytes(B)单位。
| 名称 | 缩写 | 值 |
|---|---|---|
| 千 | Ki | 1024 |
| 兆 | Mi | 1024^2 |
| 吉 | Gi | 1024^3 |
| 太 | Ti | 1024^4 |
| 拍 | Pi | 1024^5 |
| 艾 | Ei | 1024^6 |
| 泽 | Zi | 1024^7 |
| 尧 | Yi | 1024^8 |
| 名称 | 缩写 | 值 |
|---|---|---|
| 千 | k | 1e3 |
| 兆 | M | 1e6 |
| 吉 | G | 1e9 |
| 太 | T | 1e12 |
| 拍 | P | 1e15 |
| 艾 | E | 1e18 |
| 泽 | Z | 1e21 |
| 尧 | Y | 1e24 |
物理常数 #
Math.js 包含以下物理常数。有关更多信息,请参阅 Wikipedia。
通用常数 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 光速 | c | 299792458 | m · s-1 |
| 万有引力常数 | G | 6.6738480e-11 | m3 · kg-1 · s-2 |
| 普朗克常数 | h | 6.626069311e-34 | J · s |
| 约化普朗克常数 | h | 1.05457172647e-34 | J · s |
电磁学常数 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 磁常数 | μ0 | 1.2566370614e-6 | N · A-2 |
| 电常数 | ε0 | 8.854187817e-12 | F · m-1 |
| 真空阻抗 | Z0 | 376.730313461 | Ω |
| 库仑 | κ | 8.9875517873681764e9 | N · m2 · C-2 |
| 基本电荷 | e | 1.60217656535e-19 | C |
| 玻尔磁子 | μB | 9.2740096820e-24 | J · T-1 |
| 电导量子 | G0 | 7.748091734625e-5 | S |
| 电导量子倒数 | G0-1 | 12906.403721742 | Ω |
| 磁通量子 | f0 | 2.06783375846e-15 | Wb |
| 核磁子 | μN | 5.0507835311e-27 | J · T-1 |
| 克利青 | RK | 25812.807443484 | Ω |
原子和核常数 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 玻尔半径 | a0 | 5.291772109217e-11 | m |
| 经典电子半径 | re | 2.817940326727e-15 | m |
| 电子质量 | me | 9.1093829140e-31 | kg |
| 费米耦合 | GF | 1.1663645e-5 | GeV-2 |
| 精细结构 | α | 7.297352569824e-3 | - |
| 哈特里能量 | Eh | 4.3597443419e-18 | J |
| 质子质量 | mp | 1.67262177774e-27 | kg |
| 氘核质量 | md | 3.3435830926e-27 | kg |
| 中子质量 | mn | 1.6749271613e-27 | kg |
| 环量量子 | h / (2me) | 3.636947552024e-4 | m2 · s-1 |
| 里德伯 | R∞ | 10973731.56853955 | m-1 |
| 汤姆逊截面 | 6.65245873413e-29 | m2 | |
| 弱混合角 | 0.222321 | - | |
| Efimov 因子 | 22.7 | - |
物理化学常数 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 原子质量 | mu | 1.66053892173e-27 | kg |
| 阿伏伽德罗 | NA | 6.0221412927e23 | mol-1 |
| 玻尔兹曼 | k | 1.380648813e-23 | J · K-1 |
| 法拉第 | F | 96485.336521 | C · mol-1 |
| 第一辐射 | c1 | 3.7417715317e-16 | W · m2 |
| 洛施密特 | n0 | 2.686780524e25 | m-3 |
| 气体常数 | R | 8.314462175 | J · K-1 · mol-1 |
| 摩尔普朗克常数 | NA · h | 3.990312717628e-10 | J · s · mol-1 |
| 摩尔体积 | Vm | 2.241396820e-10 | m3 · mol-1 |
| 萨库尔-特罗德 | -1.164870823 | - | |
| 第二辐射 | c2 | 1.438777013e-2 | m · K |
| 斯特藩-玻尔兹曼 | σ | 5.67037321e-8 | W · m-2 · K-4 |
| 维恩位移 | b | 2.897772126e-3 | m · K |
注意:loschmidt 和 molarVolume 的值是在 T = 273.15 K 和 p = 101.325 kPa 下测得的。 sackurTetrode 的值是在 T = 1 K 和 p = 101.325 kPa 下测得的。
采用值 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 摩尔质量 | Mu | 1e-3 | kg · mol-1 |
| 12C 摩尔质量 | M(12C) | 1.2e-2 | kg · mol-1 |
| 重力 | gn | 9.80665 | m · s-2 |
| 标准大气压 | 标准大气压 | 101325 | Pa |
自然单位 #
| 名称 | 符号 | 值 | 单位 |
|---|---|---|---|
| 普朗克长度 | lP | 1.61619997e-35 | m |
| 普朗克质量 | mP | 2.1765113e-8 | kg |
| 普朗克时间 | tP | 5.3910632e-44 | s |
| 普朗克电荷 | qP | 1.87554595641e-18 | C |
| 普朗克温度 | TP | 1.41683385e+32 | K |