【问题标题】:How can i get the same number value as given in JavaScript?如何获得与 JavaScript 中给出的相同数值?
【发布时间】:2020-09-24 05:58:40
【问题描述】:

我从 json 响应中得到了一个数字 1267508826984464384。我在这里打印数字。

<script>
var num = 1267508826984464384;
console.log(num);

var num = "1267508826984464384";
console.log(num);
</script>

输出是

在第一次打印中,输出与原始值不同。我需要与给定相同的值。 有可能吗?

【问题讨论】:

标签: javascript


【解决方案1】:

RegEx 用于查找数字并引用它们。查找 prop 值边界和一系列数字以及一个可选的句点,并用数字值周围的引号替换插入。

RegEx 应调整最大长度或作为字符串引用的数字的容差。
可以添加键或值前缀/后缀,以便 JSON.parse reviver 函数可以识别它们并解析为 big.js 或 BigInt。

在大多数情况下,您可能已经知道是否会收到大量数据,并且可能只需对所需的特定属性使用简单的 RegEx 替换即可。
而且,您应该与服务器端协调,以另一种可以安全使用的形式向您提供数据。

使用 BigInt 和 big.js 解析数字字符串。

str = String.raw `{"j\"son":1234561251261262131231231231231231231231231232123123123,
"array":
[123123123124124214124124124124.111,
124124124124124124124124124,
124124124124124124124124
]}
`
str = str.replace(/((?:{|,|\[)\s*(?:"(?:[^"]|\\")+"\s*:\s*)?)(\d+\.?\d*)(\s*)(?=,|}|\])/g, `$1"$2"$3`)
// note: capture group $3 is just whitespace, which can normally be ignored; included to be "technically accurate"

console.log(
  str,
  (BigInt(JSON.parse(str)[`j"son`]) + 1n).toString(),
  (Big(JSON.parse(str).array[0]).plus(0.0003)).toFixed()
)
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/big.js/5.2.2/big.min.js" integrity="sha256-gPNmhPlEOUlyAZomtrYRW/HSIjBOOl2LVxft3rsJpxI=" crossorigin="anonymous"&gt;&lt;/script&gt;

【讨论】:

    【解决方案2】:

    JavaScript 在底层使用floating point 来存储数字。 JavaScript 使用的浮点双精度只能存储 64 位数据。通过以这种方式表示数字的方式,这意味着 Number 通常可以有多大(2^53 - 1 对于双精度浮点)。示例中的数字已超过此限制(溢出),因此被 JavaScript 舍入。

    你可以使用BigInt:

    var num = BigInt(1267508826984464384);
    console.log(num); // logs 1267508826984464384n, with n representing that it's a BigInt type
    
    var num = "1267508826984464384";
    console.log(num); // logs 1267508826984464384
    

    阅读What Every Programmer Should Know About Floating-Point Arithmetic 可能会有所帮助,以了解有关为什么会这样的更多信息。

    【讨论】:

      【解决方案3】:

      BigInt 是一个内置对象,它提供了一种表示大于 253 - 1 的整数的方法,这是 JavaScript 可以用 Number 原语可靠表示并由 Number.MAX_SAFE_INTEGER 常量表示的最大数。 BigInt 可用于任意大的整数。

      来自MDN。你可以这样使用它:

      const theBiggestInt = 9007199254740991n
      
      const alsoHuge = BigInt(9007199254740991)
      // ↪ 9007199254740991n
      
      const hugeString = BigInt("9007199254740991")
      // ↪ 9007199254740991n
      
      const hugeHex = BigInt("0x1fffffffffffff")
      // ↪ 9007199254740991n
      
      const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111")
      // ↪ 9007199254740991n
      

      【讨论】:

        【解决方案4】:

        它们是不同的类型(分别是 int 和 string)。您在上面的示例中看到的是整数溢出(由 JS 安全抽象)。你可以使用一个大整数来绕过这个问题

        const hugeString = BigInt("1267508826984464384")
        
        console.log(hugeString + 1n)  // 1267508826984464385n
        

        它的类型是BitInt,它可以安全地让你将你的数字表示为一个整数。这种类型必须区别对待,加法也必须是 BigInt(如上例所示)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-11
          • 2014-12-28
          • 2022-09-23
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          • 2022-11-10
          • 1970-01-01
          相关资源
          最近更新 更多