JavaScript是否支持64位整数?


81

我有以下代码:

var str = "0x4000000000000000";   //4611686018427387904 decimal
var val = parseInt(str);
alert(val);

我得到这个值:“ 4611686018427388000”,这是0x4000000000000060

我想知道JavaScript是否处理64位整数,还是我做错了什么?



Answers:


87

JavaScript使用IEEE-754双精度(64位)格式表示数字。据我了解,这将为您提供53位精度,或者15至16个十进制数字。您的数字位数超出了JavaScript所能应付的位数,因此最终得到了一个近似值。

这样并不是真正的“错误处理”,但是如果您需要对大数进行全精度处理,显然这不是很有用。周围有一些可以处理较大数字的JS库,例如BigNumberInt64


2
Closure的goog.math.Long也可能会有所帮助:docs.closure-library.googlecode.com/git/…–
Jeremy Condit

38
也许应该补充一点,即位级操作仅限于32位IIUC。
sellibitze 2014年


5
@Michaelangelo的评论)不幸的是,ECMAScript 2015规范(版本6)没有对的官方支持UInt64;Mozilla添加了对UInt64的支持-这是非标准的。WebGL有类似的需求,但是不幸的是,没有任何Uint64Array一个,只有Uint32Array
falsarella

2
goog.math.Long文档再次发生了变化:google.github.io/closure-library/api/goog.math.Long.html(感谢@Pacerier)
benizi

10

Chromium 57版和更高版本本机支持任意精度整数。这称为BigInt,其他浏览器也正在使用它。它比JavaScript实现快得多


Opera 54+和Node.js也支持。如果javascript.options.bigint启用了标志,则Firefox 65+支持它。
David

它并不总是更快。比较此console.time("go");for (var i=0;i<10000000;++i) {} console.timeEnd("go");数字与64位数字console.time("go");for (var i=0n;i<10000000n;++i) {} console.timeEnd("go");
Cibo FATA8 '19

@ CiboFATA8:他说的是BigInt作为本机浏览器组件,而不是用JavaScript实现的BigInt。您正在比较js Number,它与本地浏览器BigInt(也不是64位)的浮点数的精度约为53位(不是64)。
hippietrail
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.