我需要以非指数形式在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方法。
答案 0 :(得分:4)
您可以使用toPrecision
参数指定要显示的位数:
x.toPrecision(31)
但是,在我测试的浏览器中,上述代码仅适用于Firefox。根据ECMAScript规范,toPrecision
的有效范围是1到21,IE和Chrome都会相应地抛出RangeError
。这是因为JavaScript中使用的浮点表示实际上无法将数字实际表示为31位精度。
答案 1 :(得分:2)
使用数字(字符串)
实施例:
var a=Number("1.1e+2");
给出a = 110
答案 2 :(得分:1)
答案是没有这样的内置功能。我搜索过高低。 这里是RegExp我用来将数字分成符号,系数(小数点前的数字),小数部分(小数点后的数字)和指数:
/^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/
"滚动自己"是你已经做过的答案。
答案 3 :(得分: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];
答案 4 :(得分:0)
“10000000000000000000000000000000”?
很难相信任何人宁愿看那个而不是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