是否有类似于Math的库,该库支持JavaScript BigInt?

时间:2018-08-15 22:24:53

标签: javascript bigint

我正在尝试使用数学库的某些功能,例如(pow,floor等)。但是,当我尝试将它们与Big Int一起使用时...

SmartLifecycle.stop

我知道

  

TypeError:无法将BigInt值转换为数字

我当然可以自己实现,就像...

let x = Math.pow(100n, 100n);

但是我不想回到过去并重新实现所有功能。特别是因为从我的实现看来,它应该能够毫无问题地处理它。

那我该如何使用BigInt处理Math。*?

2 个答案:

答案 0 :(得分:1)

BigInts本身是一种不同的数据类型,您无法比较在表达式中不使用它们

typeof 123;  // 'number'
typeof 123n; // 'bigint'

数字不能代表BigInts超出安全整数限制,这就是为什么不允许在BigInts和数字之间混合运算(比较运算符===,<,>除外),因为任何隐式转换都可能会丢失信息

所以您可以做的是添加一个隐式强制转换

Number( Math.pow( Number(100n) , Number(100n) ) ); // 1.0000000000000005e+200

答案 1 :(得分:1)

对于pow(),您可以简单地使用**运算符:

Math.pow(2, 175)
// 4.789048565205903e+52
2**175
// 4.789048565205903e+52
2n**175n
// 47890485652059026823698344598447161988085597568237568n

floor()和大多数Math函数一样,都与整数无关。

实际上,只有5个Math函数接缝与整数有关:

  • Math.abs()
  • Math.max()
  • Math.min()
  • Math.pow()
  • Math.sign()

其他函数涉及实数:

  • 三角函数(cosacossinasintanatanatan2
  • 双曲函数(coshacoshsinhasinhtanhatanh
  • 根(sqrtcbrthypot
  • 圆形(roundceilfloortrunc
  • 对数(expexpm1loglog10log1plog2
  • 随机(random
  • 位(clz32froundimul

因此,这相当于Math的{​​{1}}:

BigInt