【问题标题】:Why does a number get its last 2 digits turned to 0?为什么一个数字的最后2位变成0?
【发布时间】:2021-07-03 18:35:37
【问题描述】:

使用

您好,我正在使用我存储在数据库中的一些用户 ID 来开发我的 discord 机器人,然后我会返回 ping 他们或给他们角色。

问题

虽然这是问题所在,但在数据库中,它们从前:533692905387196429 变为533692905387196400。我尝试将它设置为一个字符串,它在数据库中工作,它完全按照它应该的方式存储。但是,当我从数据库中取回它们并将它们转换为数字或整数时,它们又会变成 ex:533692905387196400

尝试使用

我尝试使用parseInt()parseFloat()Number(),但它们都给出了相同的结果。

更多信息

此外,如果我删除 2 位数字,例如:533692905387196429我从那里删除 19,它将返回 533692905387(19)6429 而不是 533692905387196429 而不是 533692905387196400

任何帮助表示赞赏!

【问题讨论】:

标签: javascript node.js discord discord.js


【解决方案1】:

所以,Number.MAX_SAFE_INTEGER 是 9007199254740991(即 253 - 1)。您的数字太大,无法保持完整的精度。

如果您想要一个具有该级别数字和精度的数字,您可以使用BigInt,然后您必须非常小心如何使用该BigInt,因为它不能直接用于代替常规@ 987654324@ 类型,但它可以保持无限精度,并且您可以在两个 BigInt 值之间进行数学运算。

最好将它用作BigInt 还是String 真的取决于你用它做什么。如果这些只是某种您实际上并没有进行数字运算的 ID,那么您可以将其保留为字符串。

【讨论】:

  • +1。如果您想要任意大的标识符,我会补充说,字符串是 10 次中的 9 次。与 BigInt 等特殊类型相比,字符串更容易推理,这在 imo 中真的是矫枉过正
【解决方案2】:

数字太大,所以 Javascript 不能保持完全精度!

> 533692905387196429
533692905387196400

您可以通过将它们存储为字符串来解决此问题:

> '533692905387196429'
'533692905387196429'

您不需要对 Discord ID 进行任何数学运算,因此在任何地方将它们作为字符串存储和处理都不会有任何问题。

【讨论】:

  • 再次阅读我的主题。而且当我使用它们时,我需要它们是数字或整数,而不是字符串。如果您没有完全阅读,我已经说过我尝试将它们存储为字符串,但效果很好,但是当我将它们取回时,它们最终会再次损坏..
  • @VikkiVuk 不幸的是,这在 javascript 中是不可能的,除非您转换为像 BigInt 这样的特殊类型,它可以存储比 number 类型更多的位
  • Discord ID 或“Snowflakes”在 Discord.js 中存储为字符串,因此您确实没有理由需要将它们转换为整数:discord.js.org/#/docs/main/stable/typedef/Snowflake
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多