如何在Javascript中格式化(真正的)大数字

How to format (really) big numbers in Javascript?

本文关键字:数字 Javascript 格式化      更新时间:2024-05-24

我想要像库JavaScript BigNum和Numeral.js这样的东西一起工作。

在Numeral.js中,我可以使用这样的字符串:

var number = numeral('1110000000000000000000000000000000000000000000000000011100000000000000000011111111100');

number.format();的结果确实令人失望:

"1.11e+84"

有什么方法可以很好地格式化一个(真正的)大数字吗?

编辑:我不想回避科学记数法,这是一个错误的假设。我想"很好地"格式化,正如我所希望的,例如:

var number = numeral(1000);
numeral.defaultFormat('$0,0.00');
number.format();
// '$1,000.00'

好吧,如果数字很大:

var number = numeral('100000000000000000000000000');
"$9.999999999999999e+25"

这真是一团糟。我知道JavaScript不能处理大数字,但我的问题是正是,因为这一点!我想要一个图书馆或这个问题的可能解决方案。

如果您只支持最近的浏览器,我认为只使用Intl.NumberFormat.就足够了

尽管你在大数字上失去了精度,但它将帮助你很容易地显示大数字和货币:

var number = 1234567890123456789012345678901234567890;
console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// → 1.234.567.890.123.460.000.000.000.000.000.000.000.000,00 €
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// → ¥1,234,567,890,123,460,000,000,000,000,000,000,000,000

您可以使用Intl.NumberFormat.prototype.format、String.protype.slice()、String.protoype.contat()

var number = 2.9364136545300044e+24;
var n = new Intl.NumberFormat().format(number);
var res = n.slice(0, 9).concat(".").concat(n.slice(10, 12));
console.log(res);

如果您希望像"111000000000000000000000000000000000011100000000000000000011111111100"这样的数字在处理和打印时不会丢失精度,您可以:

  1. 将此数字存储为字符串,永远不要转换为数字。缺点很明显:您将无法使用字符串表示中的数字执行算术运算。

  2. 你可以使用一个大数字库,例如大数字(https://www.npmjs.com/package/big-numbers)。这将允许您执行计算,并且不会丢失精度。

示例代码:

var bn = new BugNumbers();
var longNumber = bn.of('1110000000000000000000000000000000000000000000000000011100000000000000000011111111100');
var longNumberPlusOne = longNumber.add(1);
// Should pring1110000000000000000000000000000000000000000000000000011100000000000000000011111111101
console.log(bn.format(longNumberPlusOne));

查看文档以了解详细信息:http://www.bignumbers.tech