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的对面的主要内容,如果未能解决你的问题,请参考以下文章