代码之家  ›  专栏  ›  技术社区  ›  Oz.

与JS中的Number.toExponential相反

  •  7
  • Oz.  · 技术社区  · 14 年前

    我需要在JavaScript中以非指数形式获取一个非常大的数字的值。 Number.toFixed 简单地以指数形式将其作为字符串返回,这比我得到的要糟糕。

    这就是 固定数量 返回:

    >>> x = 1e+31
    1e+31
    >>> x.toFixed()
    "1e+31"
    

    Number.toPrecision 也不起作用:

    >>> x = 1e+31
    1e+31
    >>> x.toPrecision( 21 )
    "9.99999999999999963590e+30"
    

    我想要的是:

    >>> x = 1e+31
    1e+31
    >>> x.toNotExponential()
    "10000000000000000000000000000000"
    

    我可以编写自己的解析器,但如果存在的话,我宁愿使用本机JS方法。

    5 回复  |  直到 14 年前
        1
  •  1
  •   Rory McCrossan Hsm Sharique Hasan    9 年前

    答案是没有这样的内置函数。我到处找。 下面是我用来将数字分成符号、系数(小数点前的数字)、小数部分(小数点后的数字)和指数的RegExp:

    /^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/
    

    “自己滚”就是答案,你已经做到了。

        2
  •  4
  •   casablanca    14 年前

    你可以用 toPrecision 使用指定要显示的位数的参数:

    x.toPrecision(31)
    

    然而,在我测试的浏览器中,上面的代码只适用于Firefox。根据ECMAScript规范 托普雷西 是1到21,IE和Chrome都会抛出一个 RangeError 因此。这是因为JavaScript中使用的浮点表示法无法实际表示31位精度的数字。

        3
  •  2
  •   Erik Gustafsson    9 年前

    使用数字(字符串)

    例子: var a=Number("1.1e+2"); 给出a=110

        4
  •  0
  •   PleaseStand    14 年前

    可以使用字符串函数扩展JavaScript的指数输出。不可否认,我得出的结论有些神秘,但如果 e 是肯定的:

    var originalNumber = 1e+31;
    var splitNumber = originalNumber.toString().split('e');
    
    var result;
    if(splitNumber[1]) {
        var regexMatch = splitNumber[0].match(/^([^.]+)\.?(.*)$/);
        result =
            /* integer part */ regexMatch[1] +
            /* fractional part */ regexMatch[2] +
            /* trailing zeros */ Array(splitNumber[1] - regexMatch[2].length + 1).join('0');
    } else result = splitNumber[0];
    
        5
  •  0
  •   kennebec    14 年前

    “100000000000000000000000000000”?

    很难相信有人愿意看这个而不是1.0e+31,

    或html:10 31个 . 但有一种方法,大部分是针对负指数(分数):

    function longnumberstring(n){
        var str, str2= '', data= n.toExponential().replace('.','').split(/e/i);
        str= data[0], mag= Number(data[1]);
        if(mag>=0 && str.length> mag){
            mag+=1;
            return str.substring(0, mag)+'.'+str.substring(mag);            
        }
        if(mag<0){
            while(++mag) str2+= '0';
            return '0.'+str2+str;
        }
        mag= (mag-str.length)+1;
        while(mag> str2.length){
            str2+= '0';
        }
        return str+str2;
    }
    
    
    
    input: 1e+30
    longnumberstring: 1000000000000000000000000000000
    to Number: 1e+30
    input: 1.456789123456e-30
    longnumberstring: 0.000000000000000000000000000001456789123456
    to Number: 1.456789123456e-30
    input: 1.456789123456e+30
    longnumberstring: 1456789123456000000000000000000
    to Number: 1.456789123456e+30
    input: 1e+80 longnumberstring: 100000000000000000000000000000000000000000000000000000000000000000000000000000000
    to Number: 1e+80