JS中Number.toExponential的对面

问题描述 投票:7回答:5

我需要以非指数形式获取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方法。

javascript numbers scientific-notation
5个回答
1
投票

答案是没有这样的内置功能。我搜索过高低。这是RegExp我用来将数字分成符号,系数(小数点前的数字),小数部分(小数点后的数字)和指数:

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

“您自己滚动”是答案,您已经这样做了。


4
投票

您可以将toPrecision与参数一起使用,以指定要显示的位数:

toPrecision

但是,在我测试过的浏览器中,以上代码仅适用于Firefox。根据ECMAScript规范,x.toPrecision(31) 的有效范围是1到21,IE和Chrome都相应地抛出toPrecision。这是由于以下事实:JavaScript中使用的浮点表示法无法实际表示精度为31位的数字。


2
投票

使用RangeError

示例:

Number(string)

Return:

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


0
投票

可以使用字符串函数扩展JavaScript的指数输出。诚然,我提出的内容有些晦涩难懂,但是如果a = 110之后的指数为正,它就可以工作:

e

0
投票

“ 10000000000000000000000000000000”?

[很难相信有人会比1.0e + 31更愿意看它,

或html中:10 31。但这是一种方法,其中大部分是针对负指数(分数)的。

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];
© www.soinside.com 2019 - 2024. All rights reserved.