我遇到一个问题,20个字符串转换为JS新的NUMBER方法。
var x4 = "22222222222222222222";
var x5 = "22222222222222222229";
Number(x4)
parseInt(x5);
<小时/>
//Output
22222222222222220000
22222222222222220000
我期望获得与变量相同的值,但采用数字格式,但我不知道这里出了什么问题。将任意位数的字符串转换为数字的最佳方法是什么。
最佳答案
JavaScript 将数字存储为 Float64
(又名 IEEE 754 double-precision)。
因此,整数(整数,无分数)被限制为 53 位(52 位显式,1 位隐式)。
任何大于该值的数字都无法在不损失精度的情况下存储;正在做出妥协并存储近似值。
在 JS 中,您可以使用 Number.MAX_SAFE_INTEGER
获取这个数字 (2 ^ 53 - 1),
或者,如果您想检查数字是否是“安全整数”(不会丢失精度),请使用 Number.isSafeInteger
。
JS 原生无法存储大于 Number.MAX_SAFE_INTEGER
的数字;但是,根据您手头的任务,可以使用带有自定义的 String
/Array
/Buffer
来模拟更大的数字(成本高昂)执行数学运算的方法,使用为您执行此操作的第三方库,或者,如果您使用的是 NodeJS,则使用更高效的 native (编译)库来处理大量数字(例如 bignum )。
更新:
自从我发布上述答案以来,JavaScript 获得了对 BigInt 的支持,这是一种任意大的安全整数格式。
还添加了 BigInt 文字,它们只是带有 n
后缀的数字。因此,对于您的示例:
const x4 = 22222222222222222222n;
const x5 = 22222222222222222229n;
这里没有精度损失。 你甚至可以走得更远;以下内容将在完全不损失精度的情况下工作,尽管速度非常慢:
const veryLargeNumber = x4 ** 10000n;
// 29368033185714599045483110729334710018527698466665246504292741901594849999445152112231214493149844001358430994081988271893728711217783149614681323681876825053646556106638954761114573427277415424n
关于Javascript类型从字符串到数字的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185424/