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.3
在 JavaScript
中执行将返回 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。