正如问题here所述,即使是最新的Ecmascript 8也不支持64位整数。
但bigInt的stage 3 proposal看起来很有希望,我希望它很快会被添加到Js规范中。
然而,即使根据提案,我们也必须使用特殊构造函数来声明大数字。 (Q1)背后的技术原因是什么?无法以一般方式代表大数?
let bigNum = 2 ** 64 // Why can't JS do this without losing precision? (at least in future)
我知道 JavaScript表示使用IEEE-754双精度(64位)浮点的所有数字,这会导致问题。
(Q2)为什么Javascript不能使用其他标准代表所有数字而不会丢失精度?
(Q3)如果Javascript真的这样做会出现什么并发症?
编辑:正如T.J所述,我们可以使用后缀而不是构造函数,但我仍然认为这不完全是通用符号
答案 0 :(得分:1)
(Q1)背后的技术原因是什么,无法以一般方式代表大数字?
打破网络。 JavaScript数字的基本原理现在无法改变,最初定义后20多年。还有性能问题:JavaScript的当前数字(IEEE-754二进制双精度[64位]精度)是非常快浮点,这要归功于内置于CPU和数学协处理器。这种速度的成本是精确的;任意精度(或精确范围大得多)的成本就是性能。
将来的某一天,如果JavaScript将获得IEEE-754 64位甚至128位十进制浮点数(请参阅here和here),这些格式(2008年推出)扩散到生态系统中并获得硬件支持。但这就是我的猜测。 : - )
(Q2)为什么Javascript不能使用其他一些不会丢失精度的标准代表所有数字?
见Q1。 : - )
(Q3)如果Javascript真的这样做会出现什么复杂情况?
见Q1。 : - )
即使根据提案,我们也必须使用特殊的构造函数来声明大数字。
如果 您需要特定的64位。如果你只是想要BigInts,那么提案会包含一个新的符号n
后缀:2n
是一个BigInt 2.所以对于BigInts,你的例子就是
let bigNum = 2n ** 64n;