我想要像库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无法处理大数字,但我的问题是完全因为那个!我想要一个库或这个问题的可能解决方案。
答案 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这样的数字而不会丢失精度,则可以:
将此数字存储为字符串,切勿转换为数字。缺点很明显:您将无法使用字符串表示形式的数字执行算术运算。
您可以使用大数库之一,例如大数(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