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

时间:2015-02-25 00:04:13

标签: javascript formatting precision arbitrary-precision

我想要像库JavaScript BigNumNumeral.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无法处理大数字,但我的问题是完全因为那个!我想要一个库或这个问题的可能解决方案。

3 个答案:

答案 0 :(得分:1)

如果您仅支持recent browsers,我认为您只需使用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




答案 1 :(得分:0)

您可以使用Intl.NumberFormat.prototype.format,String.prototype.slice(),String.prototype.concat()

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

答案 2 :(得分:0)

如果要处理和打印像'1110000000000000000000000000000000000000000000000000000000011111100000000000000000011111111100这样的数字而不会丢失精度,则可以:

  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