Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript 处理 Int64

  JavaScript 中的数值类型是一个很奇葩的东西,它以 64 位的 IEEE-754 来存储,而位运算又会将其转换成 Int32 后再处理。也就是说 JavaScript 无法存储 64 位的整数类型,因为 64 位的 IEEE-754 只有 53 位精度。但是在实际业务中我们可能会遇到 64 位整数这样的东西,然后就要想办法解析。
  最近就遇到从字节流中解析出 Int64 的需求,于是写了这样的代码和大家分享下: function int64BEtoNumber(bytes) { let sign = bytes[0] >> 7; let sum = 0; let digits = 1; for (let i = 0; i < 8; i++) { let value = bytes[7 - i]; sum += (sign ? value ^ 0xFF : value) * digits; digits *= 0x100; } return sign ? -1 - sum : sum; } function numberToInt64BE(number) { let result = []; let sign = number < 0; if (sign) number = -1 - number; for (let i = 0; i < 8; i++) { let mod = number % 0x100; number = (number - mod) / 0x100; result[7 - i] = sign ? mod ^ 0xFF : mod; } return result; }   虽然这对函数可以将字节数组中的 Int64 转换成 number,但这依然无法突破 JavaScript 语言层面上对 number 类型存储的限制。所以对于精度超出 53 位的数据依然会丢失。
  由于 JavaScript 没法重载运算符,所以也无法封装出一个和 number 等价的高精度 number 出来。之前曾想用 16 进制字符串表示这个数字,但后来发现没卵用后就放弃了。
网名:
54.211.148.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^