javascript 大整数舍入,因为精度?(为什么?)

IT技术 javascript google-chrome safari precision
2021-03-14 21:45:01

如果你这样做

for(var i = 0; i < 30; i++){console.log(i + " == " + 78764357878563800 + " ? ");console.log((78764357878563790+i) == 78764357878563800);}

你开始比较 78764357878563790 和 78764357878563790+29 之间的值,所以......就像你看到如果你运行它一样,你会从 i = 8 到 24。

所以我不知道我是否不明白,但不应该存在 maxint(我不知道)和 maxint-1 ???然后 max 与 maxint-1 不同?

我想这就像浮点数一样精度......但这不应该只命中浮点数,例如,数字+1总是给后继者?(所以在上面的例子中,如果 i = 78764357878563790 并加上 i++,那么你就进入了一个无限循环。

我事先知道浮点数存在这种类型的数字间距,但从来没有遇到过整数也不能表示 i+1 和 i-1 的情况(我一直认为 unsigned maxint + 1 会进位并给出 0)。

任何建议:

  • 这是最大数量,什么是js中的前数。
  • 如何处理或知道整数的这种行为何时开始发生。
  • 如何处理这个大数字和比这更大的数字会很好。
2个回答

Javascript 中没有整数。

数字是双精度浮点数,精度为 15-16 位。这与您的结果一致。

正如我所怀疑的那样……所以 JS 中没有整数。

因此,您在 js 中没有整数,就像您在其他语言中指定的那样(因此它们最像别名),如果您来自具有 int 和 unsigned int 的其他语言并且知道在背部。

所以对于处理大整数,我建议自己像

if(someInt+1 == someInt || someInt-1 == someInt) { //use big number }

或者类似的东西,到目前为止我只在js中搜索了BigInt库,在这里找到了一个整数的结果

而对于浮点

所以我回答了我的3个问题。

  • 这是最大数量,什么是js中的前数。与 Float 可以给出的相同......但是你会开始在某个地方出现间隙......那就是将 +1 添加到它会给出相同的数字而不是连续的......所以你有 2 个“最大整数” max int 您可以添加 +1 并获得下一个数字和能够给出 64 位浮点数的最大整数。

  • 如何处理或知道整数的这种行为何时开始发生。

  • 如何处理这个大数字和比这更大的数字会很好。

使用上面 2 个之一:一个大的 int 库或检查“someInt+1 == someInt || someInt-1 == someInt”。