如果我需要计算9,007,199,254,740,993的东西怎么办?

时间:2014-08-10 20:04:52

标签: javascript

我正在阅读David Herman的Effective Javascript,并且刚刚了解了JavaScript如何处理数字:

  

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

我很好奇,所以我把this jsfiddle拼凑起来试试看:

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

有点理解为什么会这样 - 在简单(简单,简单)的语言中,对于JavaScript编码数字的方式,不再有0和1的“槽” ,所以它必须停在9,007,199,254,740,992。

所以:如果我发现自己拥有9,007,199,254,740,993只小狗,我想怎么办,并想写一些代码来帮助我记住哪一个是哪个?我需要使用JavaScript以外的东西吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

你必须做一些解决方案。一个例子是:

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);

请注意,如果您要计算负数,那么您应该考虑到这一点。此外,解决方案取决于您的需求,这只是一个示例,您可能需要修改它以满足您的需求,但它只是让您大致了解您需要做什么,或者至少是一种思考方式说话。

答案 1 :(得分:0)

当然你可以做到;你不能用原语做到这一点。像JSDecimal这样的图书馆以其他方式代表数字。