如何使用javascript/node处理巨大的数字



不确定是否有一个简单的答案。好吧,我正在构建一个系统/数据库,我想在一个字段中处理任何类型的数字。不确定我是否需要给出数据库结构的细节,因为我遇到的问题是,我可以用字符串进行复制。

我正在用这个号码做一个测试:

12312312312312312312312311.000000000000000000000000000000

但请记住,我正在寻找一个解决方案,也可以处理这个数字:

12312312312312312312312311.987987987987987987987987987987

我的想法是打印出这两种情况的确切值。但在第一种情况下,打印出来:

12312312312312312312312311

到目前为止,我研究了Stack Overflow,发现了以下帖子:

如何避免在JavaScript中使用科学的大数字表示法?

我试过一些解决方案,但没有一个能像我预期的那样奏效。

我还尝试了以下解决方案:

BigInt(12312312312312312312312311.000000000000000000000000000000)

但它打印出来:12312312312311989665792(顺便说一句,很奇怪(

有人知道我可以试试吗?

谢谢,

您可以使用此库:https://github.com/MikeMcl/bignumber.js/

const BigNumber = require('bignumber.js');
let x = new BigNumber("12312312312312312312312311.000000000000000000000000000000");
console.log(x.minus("0.012012012012012012012012012013").toFixed())

有一个针对JavaScript Decimal类型的第1阶段建议,但作为第1阶段,这是非常早期的

与此同时,你有几个选择:

  1. 如果搜索"JavaScript大小数",可以找到各种"大小数"库。

  2. 您可以在新的BigInt类型周围使用包装器,并将您的值乘以所需的任何最小单位。例如,对于给定的示例,您可以乘以1000000000000000000000000000000。在输出时,您可以插入小数点:

下面是#2的一个例子:

const multiplierString = "1000000000000000000000000000000";
const multiplier = BigInt(multiplierString);
const dotindex = multiplierString.length - 1;
const ex1 = BigInt("12312312312312312312312311000000000000000000000000000000");
const ex2 = BigInt("12312312312312312312312311987987987987987987987987987987");
function format(num) {
let str = num.toString();
str = str.substring(0, str.length - dotindex) + "." + str.substring(dotindex);
return str;
}
console.log(format(ex1));
console.log(format(ex2));

如果你喜欢,你可以把它封装到一个实用程序类中。

当精度很重要时,这与JavaScript的传统数字类型处理小得多的小数值时使用的模式相同。金融应用程序不能使用传统的数字类型(因为0.1 + 0.2 === 0.3由于IEEE-754浮点不精确而为假(,因此它们通常以基本单位工作(比如说,它们以美分甚至百分之一美分工作,而不是美元(。以上是相同的想法。

最新更新