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