使用JavaScript缩短大数字

3

我有这个大数:
21212202382541035306949186015338569645685453497668055588619610488832

Javascript自动将其缩短为:
2.1212202382540943e+67

但是,由于我将其放在一个固定宽度的表格单元格中,因此数字需要少于或等于11位。

例如,如果我有上述数字,则应将其转换为:
~2.1212e+67

而且,如果数字是:

128330558031338336,则应显示~1.2833e+17

因此,基本上,如果数字的长度超过11位,则应开始添加10的幂并开始舍入该数字。

如何在JavaScript中实现此目的?

我尝试使用substring(),但我无法确定要显示的确切幂。


编辑

最终脚本如下:

if ( num.length > 11 ) {
    num = parseFloat( num );
    var n = '~'+ num.toExponential( 4 );
} else {
    var n = num;
}

非常感谢Black Maggie
2个回答

7
源代码:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toExponential 在javascript中有一个toExponential()函数。
如果您想要指数表示法中剩余的字符总数为11个,则可以传递小数点后保留的数字位数。
对于您的数字21212202382541035306949186015338569645685453497668055588619610488832,toExponential(5)可能会得到2.12122e+67。
更新:从mozilla选择了更好的来源,而不是w3school。谢谢@T.J. Crowder 更新2:源代码:http://www.php.net/manual/en/language.types.float.php 对于php,请使用round()函数,似乎可能会强制将数字转换为科学计数法。

3
+1 for toExponential. 更好的链接:http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.6 | https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toExponential - T.J. Crowder
1
哇,谢谢,我从来不知道有这样的函数。速度也很快。欢迎来到SO。 - Peon
+1,对于toExponential,如果您能替换链接,那就太好了。 - Moritz Roessler
另外一个问题,PHP中是否有类似的函数呢? - Peon

2
我认为在你的情况下,使用toPrecision会更加合适。如果你的数字差异很大,您可能需要一些技巧来适应您的表格单元格。例如,尝试使用8个有效数字,测试字符串长度,如果太长,则尝试使用7、6和5。更新:好的,我对以下代码进行了一些修改:
num = new Number(<your num>);
alert("prec: " + num.toPrecision(5) + " exp: " + num.toExponential(4));

样例输出:

prec: 364.00 exp: 3.6400e+2
prec: 3.6435e+13 exp: 3.6435e+13

我认为这取决于您是否想始终看到指数数字还是只在必要时才看到。在前一种情况下,toPrecision() 更好,因为它尽可能地保留数字的固定点,因此您可以在相同的字符串长度中获得更高的精度。如果您希望始终使用指数数字,则 toExponential() 更好。如果您的数字始终足够大以成为指数形式,则没有关系。


1
VisioN的评论 - Moritz Roessler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接