为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免对JavaScript中的大数进行科学表示法?

如何避免对JavaScript中的大数进行科学表示法?

繁星点点滴滴 2019-06-18 17:07:13
如何避免对JavaScript中的大数进行科学表示法?当数字变大时,JavaScript将大int转换为科学表示法。我怎样才能防止这种情况发生?
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

数字固定,但如果数字>=1e21,且最大精度为20,则使用科学表示法。除此之外,您还可以使用自己的方法,但这会很麻烦。

function toFixed(x) {
  if (Math.abs(x) < 1.0) {
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) {
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    }
  } else {
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) {
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    }
  }
  return x;}

上面使用的是廉价的-‘n’-简单的字符串重复((new Array(n+1)).join(str))。你可以定义String.prototype.repeat用俄国农民乘法代替那个。

这个答案只适用于问题的上下文:在不使用科学符号的情况下显示大量数字。对于其他任何事情,您都应该使用BigInt库,例如BigNumber利蒙氏BigInt,或BigInteger..展望未来BigInt(注意:不是Leemon‘s)应该是本地支持的(有了支持,而且正在为火狐).


查看完整回答
反对 回复 2019-06-18
?
慕仙森

TA贡献1827条经验 获得超7个赞

对于较小的数字,而且您知道需要多少小数,您可以使用toFix,然后使用regexp删除尾随零。

Number(1e-7).toFixed(8).replace(/\.?0+$/,"") //0.000


查看完整回答
反对 回复 2019-06-18
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我知道这是个老问题,但最近很活跃。MDN到LocaleString

const myNumb = 1000000000000000000000;console.log( myNumb ); // 1e+21console.log( myNumb.toLocaleString() ); 
// "1,000,000,000,000,000,000,000"console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) ); // "1000000000000000000000"

您可以使用选项来格式化输出。

注:

在小数点16位之后,Number.toLocaleString()循环,所以.

const myNumb = 586084736227728377283728272309128120398;console.log( myNumb.toLocaleString('fullwide', { useGrouping: false }) );

.回来.

586084736227728400000000000000000000000

如果精确性在预期的结果中很重要,这可能是不可取的。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 509 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信