【问题标题】:What's the point of having values above Number.MAX_SAFE_INTEGER?具有高于 Number.MAX_SAFE_INTEGER 的值有什么意义?
【发布时间】:2021-01-23 22:06:09
【问题描述】:

JavaScript 具有由Number.MAX_SAFE_INTEGER 定义的a limitation in integer precision。超出此范围的任何数字都有不准确的风险。这是因为位移动导致无法在内存中准确表示as outlined in this answer

var max = Number.MAX_SAFE_INTEGER;

max + 0;    // 9,007,199,254,740,991
max + 1;    // 9,007,199,254,740,992
max + 2;    // 9,007,199,254,740,992 (!)
max + 3;    // 9,007,199,254,740,994
max + 4;    // 9,007,199,254,740,996 (!)
// ...

任何高于max 的结果都非常不可靠,几乎完全没用,如果开发人员没有预料到或没有意识到这个限制,很容易导致错误。

我的问题是,超过这个值的数字有什么意义? JavaScript 是否有任何实际用途以允许 Number 超出此范围?可以达到Number.MAX_VALUE(1.79e+308),比MAX_SAFE_INTEGER大很多,但是这两个值之间的一切都不是很有用,它迫使开发者切换到BigInt

【问题讨论】:

  • 你真的需要 15位的精度吗?
  • 因为 JavaScript 使用单一类型来表示整数和浮点数。所以可能存在超过该大小的安全双精度浮点数

标签: javascript


【解决方案1】:

这两个值之间的一切都不是很有用,它迫使开发人员切换到 BigInt。

如果不需要绝对精度,它会很有用。在处理大量数字时,要求这么多并不常见。

以增量游戏为例。它们通常需要表示巨大的数字,但值的尾部微不足道(例如,千位,当处理的数字约为 1e20 时)并不重要,可以安全地丢弃而不影响功能。

BigInts 也是一个新事物。在它存在之前,能够表示巨大的数字是很有用的,即使它们的最低有效数字有时会稍微不准确。在 BigInts 之前,尽管有一点不准确,但能够表示巨大的数字总比根本无法表示巨大的数字要好。

【讨论】:

  • 哦,这很有趣。我不知道 JavaScript 之前 BigInt 存在一段时间。
  • 它启动了less than 2 years ago
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多