单位 #

Math.js 支持单位。单位可用于执行计算和转换。

用法 #

可以使用函数 math.unit 创建单位。此函数接受一个包含值和单位的字符串参数,或两个参数,第一个为数值,第二个为包含单位的字符串。大多数单位支持前缀,例如 kkilo,许多单位既有全名也有缩写。返回的对象是一个 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)

但此表达式省略了 molK 之间的第二个 /,导致结果错误

// 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)

总之:注意隐式乘法。如有疑问,请始终使用显式的 * 和括号。

计算 #

支持单位的操作包括 addsubtractmultiplydividepowabssqrtsquarecubesign。当参数是角度时,也支持三角函数,例如 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)这样的温度刻度时,这可能会导致意外的行为。通常,应避免使用 celsiusfahrenheit 进行计算。而应使用 kelvin(或 K)和 rankine(或 degR)。此示例重点介绍了在使用 celsiusfahrenheit 进行计算时的一些问题

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 的第二个参数也可以是一个配置对象,由以下属性组成

也可以将一个可选的 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

支持单位名称中的自定义字符 #

默认情况下,新单位的名称

可以通过覆盖 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 作为其值创建。要将值转换为例如 BigNumberFraction,可以使用函数 math.fractionmath.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

在使用表达式解析器时,可以将数值解析为 FractionBigNumber

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},其中 mathjsfixPrefix 属性是可选的。用于反序列化单位,请参阅 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) #

获取单位转换为指定单位(带可选前缀但不带值的单位)时的值。返回值的类型取决于单位的创建方式,可以是 numberFractionBigNumber

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

以下二进制前缀可用。它们可用于 bitsb)和 bytesB)单位。

名称 缩写
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 &ohm;
库仑 κ 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 &ohm;
磁通量子 f0 2.06783375846e-15 Wb
核磁子 μN 5.0507835311e-27 J · T-1
克利青 RK 25812.807443484 &ohm;

原子和核常数 #

名称 符号 单位
玻尔半径 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

注意:loschmidtmolarVolume 的值是在 T = 273.15 Kp = 101.325 kPa 下测得的。 sackurTetrode 的值是在 T = 1 Kp = 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
Fork me on GitHub