Напротив Number.toExponential в JS - PullRequest
       20

Напротив Number.toExponential в JS

7 голосов
/ 13 ноября 2010

Мне нужно получить значение чрезвычайно большого числа в 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, если таковой существует.

Ответы [ 5 ]

4 голосов
/ 13 ноября 2010

Вы можете использовать toPrecision с параметром, указывающим, сколько цифр вы хотите отобразить:

x.toPrecision(31)

Однако среди протестированных мною браузеров приведенный выше код работает только наFire Fox.Согласно спецификации ECMAScript, допустимый диапазон для toPrecision составляет от 1 до 21, а IE и Chrome выдают RangeError соответственно.Это связано с тем, что представление с плавающей точкой, используемое в JavaScript, не способно фактически представлять числа с точностью до 31 цифры.

2 голосов
/ 12 июля 2015

Использовать номер (строка)

Пример: var a=Number("1.1e+2"); дает = 110

1 голос
/ 26 июня 2015

Ответ - такой встроенной функции нет. Я искал высоко и низко. Вот RegExp, который я использую, чтобы разделить число на знак, коэффициент (цифры перед десятичной запятой), дробную часть (цифры после десятичной запятой) и экспоненту:

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

«Сверните свой» - это ответ, который вы уже сделали.

0 голосов
/ 13 ноября 2010

"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
0 голосов
/ 13 ноября 2010

Возможно расширить экспоненциальный вывод 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];
...