8

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

这是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 方法。

4

5 回答 5

4

您可以使用toPrecision指定要显示多少位数的参数:

x.toPrecision(31)

但是,在我测试的浏览器中,上面的代码只适用于火狐。根据 ECMAScript 规范,有效范围toPrecision是 1 到 21,IE 和 Chrome 都会RangeError相应地抛出一个。这是因为 JavaScript 中使用的浮点表示实际上无法将数字表示为 31 位精度。

于 2010-11-13T02:59:50.413 回答
4

采用Number(string)

例子 :

var a = Number("1.1e+2");

返回 :

a = 110

于 2015-07-12T09:01:20.210 回答
1

答案是没有这样的内置函数。我搜索了高低。这是我用来将数字拆分为符号、系数(小数点前的数字)、小数部分(小数点后的数字)和指数的 RegExp:

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

“自己动手”就是答案,你已经这样做了。

于 2015-06-26T15:12:54.017 回答
0

可以使用字符串函数扩展 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];
于 2010-11-13T03:45:51.953 回答
0

“100000000000000000000000000000000”?

很难相信有人宁愿看那个也不愿看 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
于 2010-11-13T04:26:09.403 回答