Javascript:将非常大和非常小的数字转换为固定的人工可读字符串

Javascript:将非常大和非常小的数字转换为固定的人工可读字符串,javascript,numbers,Javascript,Numbers,我有以下函数,我认为它可以将非常大的值(例如,1e+24)和非常小的值(例如,1e-18数字)转换为固定字符串,例如10000000000000000: convertExponentialToDecimal (exponentialNumber) { // Sanity Check - i.e., is it exponential number? const str = exponentialNumber.toString() if (str.in

我有以下函数,我认为它可以将非常大的值(例如,
1e+24
)和非常小的值(例如,
1e-18
数字)转换为固定字符串,例如10000000000000000:

    convertExponentialToDecimal (exponentialNumber) {
      // Sanity Check - i.e., is it exponential number?
      const str = exponentialNumber.toString()
      if (str.indexOf('e-') !== -1) {
        const exponent = parseInt(str.split('-')[1], 10)
        return exponentialNumber.toFixed(exponent)
      }
      if (str.indexOf('e+') !== -1) {
        const exponent = parseInt(str.split('+')[1], 10)
        return exponentialNumber.toFixed(exponent)
      }
      return exponentialNumber
    }
然而,对于很多人来说,这个过程似乎不起作用

i、 例如,1e+24的转换产生1e+24,但1e-18产生0.000000000000000001

任何人都可以发现明显的问题,或有任何指针,甚至他们自己的工作解决方案,这样的场景


如果这是任何洞察-它适用于任何小于1e+21的部件…

对于“非常大”的部件:

  if (str.indexOf('e+') !== -1) {
    let [a,b] = str.split('+')
    a = a.slice(0,-1)
    if (a.indexOf('.') !== -1) {
        b = parseInt(b) - (a.length - a.indexOf('.') -1)
    }
    return a.replace('.','')+"".padEnd(b,0)
  }
对于您的“非常小”部分(虽然这需要测试,但它在我的示例中起作用,但我没有讨论具体的案例):


数字类型为IEEE754浮点型,在帘幕后面具有双精度,其精度不足以表示1e24位数字。如果您希望避免将数字作为字符串处理,请考虑数据类型。

有带有
n
后缀的BigInt文本,它们不支持指数表示法,但幸运的是它们确实支持
**
。对于大数字,您可以使用

10n**24n; // 1000000000000000000000000n

bigint是Int,不带小数点。但是它们也很大,所以你可以负担固定点符号,比如前千位是整数部分,后千位是小数部分(最大大小取决于可用内存)。

.toFixed()
的digits参数从0到20。你可以尝试
.toPrecision()
相反。您也可以使用类似于
Math.ceil(Math.log10(n))
的方法来获取所需的位数(可能是负数)。请记住,JavaScript数字是以2为基数的浮点值,它们不能提供无限精度。问题是,您要查找的原材料实际上不在数字中。对于大指数,低端数字不存在。只有51位二进制分数的空间,甚至比不上16位十进制数字。
10n**24n; // 1000000000000000000000000n