Skip to content

内置数学函数

a-calc 3.x 提供了丰富的内置数学函数,涵盖三角函数、指数对数、取整运算、统计函数等多个类别。

三角函数

基本三角函数

默认使用角度制(degrees),可通过 set_config 切换为弧度制。

函数说明示例
sin(x)正弦sin(90)1
cos(x)余弦cos(0)1
tan(x)正切tan(45)1
javascript
import { calc } from 'a-calc'

// 常用角度的精确值
calc('sin(0)')    // '0'
calc('sin(30)')   // '0.5'
calc('sin(45)')   // '0.7071067811865476' (√2/2)
calc('sin(60)')   // '0.8660254037844386' (√3/2)
calc('sin(90)')   // '1'
calc('sin(180)')  // '0'

calc('cos(0)')    // '1'
calc('cos(60)')   // '0.5'
calc('cos(90)')   // '0'

calc('tan(45)')   // '1'
calc('tan(0)')    // '0'

注意

tan(90)tan(270) 未定义,调用会抛出错误。

反三角函数

返回值同样遵循当前角度单位设置。

函数说明定义域值域(角度制)
asin(x)反正弦[-1, 1][-90°, 90°]
acos(x)反余弦[-1, 1][0°, 180°]
atan(x)反正切(-∞, +∞)(-90°, 90°)
atan2(y, x)二参数反正切(-∞, +∞)(-180°, 180°]
javascript
calc('asin(0.5)')    // '30' (角度)
calc('asin(1)')      // '90'
calc('acos(0.5)')    // '60'
calc('atan(1)')      // '45'
calc('atan2(1, 1)')  // '45'

双曲函数

函数说明
sinh(x)双曲正弦
cosh(x)双曲余弦
tanh(x)双曲正切
asinh(x)反双曲正弦
acosh(x)反双曲余弦
atanh(x)反双曲正切
javascript
calc('sinh(0)')   // '0'
calc('cosh(0)')   // '1'
calc('tanh(0)')   // '0'

角度单位设置

通过 set_config 设置全局角度单位:

javascript
import { calc, set_config, get_config } from 'a-calc'

// 默认使用角度制
calc('sin(90)')  // '1'

// 切换到弧度制
set_config({ _angle_unit: 'rad' })
calc('sin(3.14159265358979 / 2)')  // 约为 '1'

// 切换回角度制
set_config({ _angle_unit: 'deg' })
calc('sin(90)')  // '1'

// 查看当前设置
get_config('_angle_unit')  // 'deg'

指数与对数

函数说明示例
exp(x)e 的 x 次方exp(1)2.718...
log(x)自然对数 (ln)log(2.718...)1
ln(x)自然对数(log 的别名)ln(e())1
log10(x)以 10 为底的对数log10(100)2
log2(x)以 2 为底的对数log2(8)3
javascript
calc('exp(1)')      // '2.7182818284590452...'
calc('exp(0)')      // '1'
calc('log(e())')    // '1'
calc('ln(e())')     // '1'
calc('log10(1000)') // '3'
calc('log2(256)')   // '8'

幂运算与根

函数说明示例
pow(x, y)x 的 y 次方pow(2, 10)1024
sqrt(x)平方根sqrt(16)4
cbrt(x)立方根cbrt(27)3
javascript
calc('pow(2, 8)')   // '256'
calc('pow(10, -2)') // '0.01'
calc('sqrt(2)')     // '1.4142135623730951...'
calc('sqrt(144)')   // '12'
calc('cbrt(8)')     // '2'
calc('cbrt(-8)')    // '-2' (支持负数)

提示

pow(x, y) 等价于运算符 x ** y

取整函数

函数说明示例
floor(x)向下取整(地板)floor(3.7)3
ceil(x)向上取整(天花板)ceil(3.2)4
round(x)四舍五入round(3.5)4
trunc(x)截断小数(向零取整)trunc(-3.7)-3
javascript
// 正数
calc('floor(3.7)')  // '3'
calc('ceil(3.2)')   // '4'
calc('round(3.5)')  // '4'
calc('trunc(3.9)')  // '3'

// 负数
calc('floor(-3.2)') // '-4' (更小)
calc('ceil(-3.7)')  // '-3' (更大)
calc('round(-3.5)') // '-3'
calc('trunc(-3.9)') // '-3' (向零)

绝对值与符号

函数说明示例
abs(x)绝对值abs(-5)5
sign(x)符号函数sign(-5)-1
javascript
calc('abs(-123)')  // '123'
calc('abs(456)')   // '456'
calc('abs(0)')     // '0'

calc('sign(-100)') // '-1'
calc('sign(0)')    // '0'
calc('sign(100)')  // '1'

统计函数

函数说明示例
max(a, b, ...)最大值max(1, 5, 3)5
min(a, b, ...)最小值min(1, 5, 3)1
clamp(x, min, max)限制在范围内clamp(150, 0, 100)100
javascript
// 最大最小值
calc('max(1, 2, 3, 4, 5)')    // '5'
calc('min(1, 2, 3, 4, 5)')    // '1'
calc('max(-10, -5, -1)')      // '-1'
calc('min(-10, -5, -1)')      // '-10'

// 使用变量
calc('max(a, b, c)', { a: 10, b: 25, c: 15 })  // '25'

// clamp 限制范围
calc('clamp(50, 0, 100)')     // '50' (在范围内)
calc('clamp(150, 0, 100)')    // '100' (超过上限)
calc('clamp(-50, 0, 100)')    // '0' (低于下限)

// clamp 实际应用
calc('clamp(score, 0, 100)', { score: 120 })  // '100'

常量函数

函数说明
pi()圆周率 π3.1415926535897932...
e()自然常数 e2.7182818284590452...
javascript
calc('pi()')           // '3.1415926535897932384626433832795...'
calc('pi() | =5')      // '3.14159' (格式化)

calc('e()')            // '2.7182818284590452353602874713527...'
calc('e() | <=2')      // '2.71' (格式化)

// 用于计算
calc('2 * pi() * r', { r: 5 })  // 圆周长
calc('pi() * r ** 2', { r: 3 }) // 圆面积

条件函数

函数说明示例
if(cond, t, f)条件判断if(x>0, x, 0)
random()随机数 [0, 1)random()
javascript
// if 条件函数
calc('if(x > 0, x, 0)', { x: 5 })   // '5'
calc('if(x > 0, x, 0)', { x: -3 })  // '0'

// 嵌套 if
calc('if(score >= 90, "A", if(score >= 60, "B", "C"))', { score: 85 })
// 'B'

// random 生成 [0, 1) 的随机数
calc('random()')  // 例如 '0.7234567891234567'

// 生成指定范围的随机数
calc('floor(random() * 100)')       // 0-99 的整数
calc('random() * (max - min) + min', { min: 10, max: 50 })  // 10-50

函数组合示例

几何计算

javascript
// 勾股定理
calc('sqrt(pow(a, 2) + pow(b, 2))', { a: 3, b: 4 })  // '5'

// 圆面积
calc('pi() * pow(r, 2)', { r: 5 })  // '78.5398...'

// 球体积
calc('4/3 * pi() * pow(r, 3)', { r: 3 })  // '113.0973...'

三角计算

javascript
// 已知两边和夹角求第三边(余弦定理)
calc('sqrt(pow(a,2) + pow(b,2) - 2*a*b*cos(C))', { a: 5, b: 7, C: 60 })

// 弧度角度转换
calc('degrees * pi() / 180', { degrees: 90 })  // 转为弧度

数据处理

javascript
// 百分比计算
calc('round(value / total * 100)', { value: 75, total: 200 })  // '38'

// 平均值
calc('(a + b + c) / 3', { a: 10, b: 20, c: 30 })  // '20'

// 标准化到 0-1 范围
calc('(value - min) / (max - min)', { value: 75, min: 0, max: 100 })

金融计算

javascript
// 复利计算
calc('principal * pow(1 + rate, years)', {
    principal: 10000,
    rate: 0.05,
    years: 10
})  // 约 16288.95

// 月供计算 (PMT 公式简化版)
calc('loan * rate * pow(1+rate, months) / (pow(1+rate, months) - 1)', {
    loan: 1000000,
    rate: 0.004,   // 月利率
    months: 360    // 30年
})

精度说明

a-calc 使用 Decimal.js 进行高精度计算,默认精度为 50 位有效数字:

javascript
// 高精度计算
calc('pi()')
// '3.1415926535897932384626433832795028841971693993751'

calc('sqrt(2)')
// '1.4142135623730950488016887242096980785696718753769'

// 避免浮点数精度问题
calc('0.1 + 0.2')  // '0.3' (不是 0.30000000000000004)

注意事项

  1. 角度单位:三角函数默认使用角度制,可通过 set_config({ _angle_unit: 'rad' }) 切换为弧度制
  2. 函数名大小写:函数名区分大小写,sinSIN 是不同的
  3. 参数验证:某些函数对参数有限制(如 sqrt 不接受负数,tan(90) 未定义)
  4. 精度限制:虽然精度很高,但仍有上限,极端情况可能出现精度损失
  5. 性能考虑:复杂的嵌套计算可能影响性能

基于 MIT 许可发布