【问题标题】:Javascript convert bigInt to stringJavascript 将 bigInt 转换为字符串
【发布时间】:2015-06-02 17:21:26
【问题描述】:

我正在尝试将以下大整数转换为 javascript 中的字符串,但没有成功。我的目标最终会是 '582235852866076672'

var foo = 582235852866076672;
console.log(foo); // 582235852866076700

var baz = "'" + 582235852866076672 + "'";
console.log(baz); // '582235852866076700'

var emptyString = 582235852866076672+'';
console.log(emptyString); // 582235852866076700

var n = foo.toString();
console.log(n); // 582235852866076700

我认为这个数字太大了,结果导致精度下降。 我包含了bigint library,但没有成功:

var bigint = require('bigint');
var bigintLibrary = bigint(582235852866076672).toString();
console.log(bigintLibrary); //582235852866076700

bigint 库中的 toSting 方法说明:

“将请求的base中的bigint实例打印为字符串。”

感谢所有帮助和 cmets。谢谢。

【问题讨论】:

  • 号码从何而来?您所说的数字不能作为普通的javascript数字存在,因此来源很重要。
  • @AaronDufour 数字来自发布请求的参数,我试过 var jsonString = JSON.stringify(582235852866076672);具有相同的结果 console.log(jsonString); // 582235852866076700.
  • 那么您将不得不手动解析参数。除非您可以让客户端将其作为字符串而不是数字传递?一旦库将其解析为数字,精度就会丢失,因此当它到达您的代码时为时已晚。

标签: javascript string node.js bigint


【解决方案1】:

这是一个精度问题 - 您返回的数字 (582235852866076672) 大于 JavaScript 中可表示的最大数字,即 2^53 或 9007199254740992

【讨论】:

  • 感谢回复,请问如何将整数582235852866076672转成字符串格式呢?我尝试的所有结果都是 582235852866076700
  • 你在它周围加上引号,就像我一样。您不能直接表示大于 JavaScript 中最大大小的数字——它会被截断(如您所见)。
  • 谢谢我看到了,我很好奇如何将整数 582235852866076672 转换为字符串 '582235852866076672',数据以整数形式输入,我必须将其转换为字符串,我不能只添加引号我必须转换它
  • 所以实际上这似乎是一个精度问题——例如,JavaScript 无法精确地表示该数字。该数字大于 2^53,这是 JavaScript 中可表示的最大数字。
  • 看来我必须在数据到达 javascript 端之前将其操作为字符串。
【解决方案2】:

截至 2019 年,您可以使用内置的 BigInt 和 BigInt 文字,首先,执行以下操作:

// Cast to BigInt:
var result = BigInt("1234567801234567890");
result = BigInt(1234567801234567890);

// Or use BigInt literal directly (with n suffix).
result = 1234567801234567890n

然后使用内置的toString方法:

console.log('my BigInt is', result.toString());

documentation on MDN

【讨论】:

    【解决方案3】:

    您可以使用BigInt 方法BigInt.prototype.toLocaleString()BigInt.prototype.toString()。希望有帮助。

    点击这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt 了解更多BigInt 信息。

    【讨论】:

      【解决方案4】:

      似乎即使有三个答案,但其中只有一个真正回答了问题,但这不是公认的答案......


      这是我的回答:

      首先,您不需要导入 BigInt 库(至少现在是这样)... BigInt 是 JavaScript 内置的,您可以通过调用函数来访问它:BigInt(...) 或添加数字末尾的“n”:45625625443n

      BigInt 可以容纳非常大的数字,上次我检查过,限制是 10 亿位 1。这意味着你可以保存一个大约 1×10109 的整数,在大多数情况下你很可能不需要任何这么大的整数。

      如上所示,您可以使用构造函数 (BigInt(...)) 或在末尾添加“n” (45625625443n) 来构建 BigInt 2

      使用构造函数时,参数可以是以下任意一种:

      // String
         BigInt("1234567890987654321234567890")
         // -> 1234567890987654321234567890n
      
      // Number
         BigInt(1234567890987654321234567890)
         // -> 1234567890987654321234567890n
      
      // BigInt
         BigInt(1234567890987654321234567890n)
         // -> 1234567890987654321234567890n
      
      // Boolean
         BigInt(false) // 0n
         BigInt(true)  // 1n
      

      您不能在操作中混合类型。你不能用普通的 JavaScript 数字做任何正常的操作,你必须先把它们转换成 BigInts。

      let big_int_number = BigInt(135445264365246564)
      
      // Incorrect
      big_int_number + 1365
      
      // Correct (either one)
      big_int_number + 1365n
      big_int_number + BigInt(1365)
      

      最后回答真正的问题:要将 BigInt 转换为字符串,您只需要使用内置方法 3

      let big_int_number = BigInt(135445264365246564)
      
      // Using BigInt.prototype.toString()
      let string_version = big_int_number.toString()
      
      
      /* You probably don't need this method,
         but I just put it here just because */
      
      // Using BigInt.prototype.toLocaleString()
      let string_version = big_int_number.toLocaleString()
      

      这适用于两种构造方式...

      let n_constructed = 1234567890987654321234567890n
          n_constructed.toString()       // 1234567890987654321234567890n
          n_constructed.toLocaleString() // 1234567890987654321234567890n
      
      let constructered = BigInt(1234567890987654321234567890)
          constructered.toString()       // 1234567890987654321234567890n
          constructered.toLocaleString() // 1234567890987654321234567890n
      

      如果您对 BigInt 有任何疑问,请访问MDN's reference page on BigInt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 2013-06-10
        • 2012-08-02
        • 2018-07-14
        • 2020-12-13
        • 2021-02-27
        • 1970-01-01
        相关资源
        最近更新 更多