JS中Number.toExponential的对面

Posted

技术标签:

【中文标题】JS中Number.toExponential的对面【英文标题】:Opposite of Number.toExponential in JS 【发布时间】:2010-11-13 02:31:07 【问题描述】:

我需要在 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 方法。

【问题讨论】:

【参考方案1】:

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

x.toPrecision(31)

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

【讨论】:

当我得到它时它不是一个实际数字我很好(它是为了显示目的)但 toPrecision 也不适用于大于 1e+21 的数字。在这种特殊情况下,我得到“9.99999999999999963590e+30”。我会相应地更新问题。 @Oz:是的,这就是我提到的。我认为没有任何其他内置方法可以为如此大的数字获取字符串。【参考方案2】:

使用Number(string)

示例:

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

返回:

a = 110

【讨论】:

这与我的目标相反。从字符串到数字有很多方法,但我正在寻找从一个非常大的数字到字符串而不使用求幂。 那么 var a=Number("9.9E-8"); ??它不工作.. :(【参考方案3】:

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

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

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

【讨论】:

我早就忘记了我做了什么来解决这个问题,但你是对的,没有内置的方法可以做到这一点。 @Oz 嘿,谢谢伙计,我终于可以对问题发表评论了!这是内置打印方法的一大痛点,像“printf”这样的东西肯定会很好。我现在正在开发一个自定义 NumberFormatter 类..【参考方案4】:

可以使用字符串函数扩展 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];

【讨论】:

我目前正在使用自己的转换函数来拆分数字的 toString 版本,尽管没有空数组加入,但与您的类似。但是我正在寻找一个原生 JS 函数来为我做这件事。【参考方案5】:

“100000000000000000000000000000000”?

很难相信有人宁愿看它而不是 1.0e+31,

或在 html 中:1031。 但这是一种方法,其中大部分是用于负指数(分数):

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

【讨论】:

要显示为美元值,$1e+31 不好读。价值如此之高,因为它是用户输入,用户很疯狂。谢谢你的功能,但我已经有一个我写的功能,我想知道是否有一个内置的。

以上是关于JS中Number.toExponential的对面的主要内容,如果未能解决你的问题,请参考以下文章

js scrollIntoView 滑动问题

backscore.js 真的需要 underscore.js 吗?

Underscore.js基础入门

Node.js 实战之—优化汇总

js中继承

请问大家常说的对HTML语义化的理解是啥?