js数字处理插件

Math.js (opens new window)是一个用于JavaScript和Node.js的扩展数学库。它具有支持符号计算的灵活表达式解析器,大量内置函数和常量,并提供了集成的解决方案来处理不同的数据类型,例如数字,大数,复数,分数,单位和矩阵。

npm install mathjs

# 舍入误差

Math.js 使用内置的 JavaScript Number 类型。Number 是一个浮点数,精度有限,为 64 位,大约 16 位。JavaScript Number 可以表示的最大整数是+/- 9007199254740992( +/- 2^53)。由于浮点数的精度有限,计算过程中可能会出现舍入误差。这可以很容易地证明:

// a round-off error
0.1 + 0.2            // 0.30000000000000004
math.add(0.1, 0.2)   // 0.30000000000000004

在大多数情况下,舍入误差无关紧要:它们对结果没有重大影响。但是,当向用户显示输出时,它看起来很难看。一种解决方案是将精度限制在显示输出中 16 位的实际精度以下:

// prevent round-off errors showing up in output
const ans = math.add(0.1, 0.2)     //  0.30000000000000004
math.format(ans, {precision: 14})  // '0.3'

或者使用BigNumber

math.config({
  number: 'BigNumber',      // Default type of number:
                            // 'number' (default), 'BigNumber', or 'Fraction'
  precision: 64             // Number of significant digits for BigNumbers
})

// use math
math.evaluate('0.1 + 0.2')  // BigNumber, 0.3
// round-off errors with numbers
math.add(0.1, 0.2)                                     // Number, 0.30000000000000004
math.divide(0.3, 0.2)                                  // Number, 1.4999999999999998

// no round-off errors with BigNumbers :)
math.add(math.bignumber(0.1), math.bignumber(0.2))     // BigNumber, 0.3
math.divide(math.bignumber(0.3), math.bignumber(0.2))  // BigNumber, 1.5

# 相等

由于计算中的舍入错误,比较 JavaScript 数字是不安全的。例如,0.1 + 0.2 == 0.3JavaScript中执行将返回 false,因为添加会0.1 + 0.2引入舍入错误并且不会准确返回0.3

为了解决这个问题,math.js的关系函数会检查比较值之间的相对差异是否小于配置的 option epsilon。在伪代码中(0、Infinity 和 NaN 也不例外):

diff = abs(x - y)
nearlyEqual = (diff <= max(abs(x), abs(y)) * EPSILON) OR (diff < DBL_EPSILON)

在哪里:

EPSILON是 x 和 y 之间的相对差。Epsilon 是可配置的,并且是1e-12默认设置。请参阅配置。 DBL_EPSILON是最小正浮点数,使得 1.0 + DBL_EPSILON !== 1.0。这是一个常数,其值约为 2.2204460492503130808472633361816e-16。 请注意,关系函数不能用于比较小值 ( < 2.22e-16)。这些值都被视为等于零。

例子:

// compare values having a round-off error
console.log(0.1 + 0.2 === 0.3)           // false
console.log(math.equal(0.1 + 0.2, 0.3))  // true

// small values (< 2.22e-16) cannot be compared
console.log(3e-20 === 3.1e-20)           // false
console.log(math.equal(3e-20, 3.1e-20))  // true

可用的关系函数有:compare、equal、larger、 largerEq、smaller、smallerEq、unequal。

lastUpdate: 2/24/2023, 5:32:22 PM