如何处理20位以上的数字(大整数)



我的angular程序,我需要将超过20位的数字传递给API请求。

num: any;
this.num = 2019111122001424290521878689;
console.log(this.num); // It displays "2.0191111220014244e+27"

我试图将字符串从下面的中的数字更改为

console.log(this.num.toString()); // It displays "2.0191111220014244e+27"

我的期望是,我需要将原始的大整数传递到API请求中。如果我按以下方式通过,则会显示为"2.019111220014244e+27"。

顺便说一句,我试过BigInt(this.num(,它给出了差值。

建议我

在JavaScript中,大整数文字的后缀是字母n

var bigNum = 2019111122001424290521878689n;
console.log(bigNum);

有关更多信息,请参阅

  • MDN JavaScript参考-BigInt

如果您从API获得了一个JSON格式的大数字(>SAFEINTEGER(,并且您想要获得确切的值,如字符串,那么很遗憾您不能使用JSON.parse(),因为它将使用number类型并失去精度。

有一些替代的JSON解析器,比如LosslessJSON,可以解决您的问题。

您可以使用BigInt。BigInt是一个内置对象,它提供了一种表示大于253-1的整数的方法,253-1是JavaScript可以用number原语可靠地表示的最大数字。BigInt可以用于任意大的整数。

const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n

BigInt在某些方面与Number相似,但在一些关键问题上也有所不同——它不能与内置Math对象中的方法一起使用,也不能在操作中与Number的实例混合使用;它们必须被强制为相同的类型。但是,要小心来回强制值,因为当BigInt被强制为数字时,它的精度可能会丢失。

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

问题是你在那里得到的数字不是整数。Javascript只能存储最大为Number.MAX_SAFE_INTEGER给定值的整数。在铬合金中,此编号为9007199254740991。

您所拥有的数字实际上是一个浮点数字,在浮点和整数之间转换会丢失一些精度。

最新更新