Javascript 如果我需要数9007199254740993怎么办?

Javascript 如果我需要数9007199254740993怎么办?,javascript,Javascript,我正在阅读David Herman的高效Javascript,刚刚了解了Javascript如何处理数字: JavaScript中的所有数字都是双精度浮点数,即IEEE 754标准规定的数字的64位编码,通常称为“双精度”“。如果这个事实让你想知道整数发生了什么,请记住,double可以完美地表示整数,精度高达53位。从-9007199254740992(-2^53)到9007199254740992(2^53)的所有整数都是有效的双精度整数。”(第7页) 我很好奇,所以我凑在一起试了一下: v

我正在阅读David Herman的高效Javascript,刚刚了解了Javascript如何处理数字:

JavaScript中的所有数字都是双精度浮点数,即IEEE 754标准规定的数字的64位编码,通常称为“双精度”“。如果这个事实让你想知道整数发生了什么,请记住,double可以完美地表示整数,精度高达53位。从-9007199254740992(-2^53)到9007199254740992(2^53)的所有整数都是有效的双精度整数。”(第7页)

我很好奇,所以我凑在一起试了一下:

var hilariouslyLargeNumber = 9007199254740992;

console.log(hilariouslyLargeNumber);
// 9007199254740992
console.log(hilariouslyLargeNumber + 1);
// 9007199254740992

console.log (hilariouslyLargeNumber === hilariouslyLargeNumber);
// true
console.log(hilariouslyLargeNumber === hilariouslyLargeNumber+1);
// true
console.log(hilariouslyLargeNumber === hilariouslyLargeNumber-1);
// false
我有点理解为什么会这样——在简单(simple,simple)语言中,JavaScript编码数字的0和1已经没有了更多的“槽”,因此它必须停在9007199254740992


所以:如果我发现自己拥有9007199254740993只小狗,并且想写一些代码来帮助我记住哪只小狗是哪只小狗,我该怎么办?我是否需要使用JavaScript以外的东西?如果需要,为什么?

你必须做一些编程方面的工作。例如:

var MAX_VALUE = 9007199254740992;

var lower_digit_set = 0;
var upper_digit_set = 0;


/* Do some calculations that will eventually result in lower_digit_set to be 9007199254740992 */

lower_digit_set = MAX_VALUE;

if (lower_digit_set == MAX_VALUE) {
    lower_digit_set = 0;
    upper_digit_set = upper_digit_set + 1;
}



/* What you have to keep in mid is that your final number is something you calculate,
   however you cannot display it (you probably could, but it is very complex solution that I should give it a longer thought).
   And therefore if we increase lower_digit_set as such: */

lower_digit_set = lower_digit_set + 1;

/* Then the new number will be a combination of both lower_digit_set and upper_digit_set*/

console.log("The actual number is more than once, or twice, or thrice ...etc. of the max_value");
console.log("Number of times we multiply the max value: ", upper_digit_set);
console.log("Then we add our remainder: ", lower_digit_set);

请注意,如果你要计算负数,那么你应该考虑到这一点。此外,解决方案取决于你的需要,这只是一个例子,你可能需要修改它以适应你的需要,但它只是让你大致了解你需要做什么,或者至少是一种思维方式。当然你可以这样做;你只是不能用原语。库喜欢用其他方式表示数字。

重复问题:--基本上,你需要big.js或另一个大数字库。这是一种解脱。我几乎把两个malamutes弄糊涂了。我猜我问题的第二个隐含部分,这里没有涉及到,是:为什么会这样?我只是勉强不知道站在这背后的理由。为什么会是这样?为什么你所有的比较结果都是真的?因为你的数字超出了整数的范围,因此你的值被视为浮点数(关于它们固有的不精确性,你可以在网上读到)。我会试着做一些阅读,但大部分都是我想要的(在发布这个问题之前,请注意:)有点让我不知所措。我不是CS出身,在数学方面也从来没有出色的表现。如果能简单解释一下这里发生了什么,我将不胜感激——“它们被视为浮点数。”“对我来说什么都不是。像这样玩是很危险的:数字在IEEE标准中存储为double等的幂,等于一个偶数相对间距。如果你使用多个数字,在一个较低的点这样做(只是给它一个非常简短的想法)将大大提高精度!因此,首先确保您了解参考底图模型!