Как проверить экспоненциальные значения в Javascript - PullRequest
0 голосов
/ 17 апреля 2019

Я передаю данные из файла CSV и помещаю определенные значения в массив.Некоторые из этих значений очень велики и могут быть экспортированы как экспоненциальные значения (например, 5.02041E + 12), а некоторые могут быть нормальными значениями.Я хотел бы иметь оператор if, который проверяет, являются ли эти значения экспоненциальными или нет, и если они есть, я передам их функции, которая преобразует их в «нормальные» числа (например, 5020410000000).Есть ли быстрый способ сделать это?

(эти значения передаются вызову API, поэтому их необходимо преобразовать в «нормальные» значения)

Пример того, как это может выглядеть:

valueOne = 5.02041E+12;
valueTwo = 1234;

if (valueOne.isExponential) {
  **pass to converting function**
}

//Output = 5020410000000

if (valueTwo.isExponential) {
  **pass to converting function**
}

//Output = 1234 (unchanged)

Я бы ожидал, что все значения в массиве, следовательно, будут «нормальными» значениями (т. Е. НЕ является экспоненциальной формой)

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Вы можете просто использовать toPrecision для каждого числа и убедиться, что оно конвертирует

const valueOne = 5.02041E+12;
const valueTwo = 1234;

const precisionValueOne = valueOne.toPrecision(); // "5020410000000"
const precisionValue2 = valueTwo.toPrecision(); // "1234"

Затем вы можете при желании преобразовать его обратно в числа:

sanitizedValueOne = Number(precisionValueOne); // 5020410000000
sanitizedValueTwo = Number(precisionValueTwo); // 1234
0 голосов
/ 17 апреля 2019

Числа являются числами, значения 5.02041E+12 и 5020410000000 не отличаются внутренне:

// values in code:
var withe=5.02041E+12;
var withoute=5020410000000;
console.log(withe,"?=",withoute,withe===withoute);

// values parsed from strings:
var stringwithe="5.02041E+12";
var stringwithoute="5020410000000";
var a=parseFloat(stringwithe);
var b=parseFloat(stringwithoute);
console.log(a,"?=",b,a===b);

И вы также можете видеть, что когда вы просто отображаете число, оно не будет использовать научное обозначение по умолчанию, на самом деле вам придется запросить его, используя toExponential()


Одна вещь, о которой вы можете беспокоиться, это внутренняя точность Number. У него есть метод isSafeInteger() и различные поля, например MAX_SAFE_INTEGER. Превышение этого значения может привести к неожиданным результатам:

var a=Number.MAX_SAFE_INTEGER;
console.log("This is safe:",a,Number.isSafeInteger(a));
a++;
for(var i=0;i<5;i++)
  console.log("These are not:",a++,Number.isSafeInteger(a));

Таким образом, цикл не может увеличивать a дальше, потому что здесь нет такого числа, как 9007199254740993. Следующее число, которое существует после 9007199254740992, равно 9007199254740994. Но эти цифры более чем в 1000 раз больше, чем 5020410000000 в вопросе.

0 голосов
/ 17 апреля 2019

Выполните регулярное совпадение для E+ и, вероятно, для E-

. Номер, с которого вы начинаете, должен быть текстовым, но вам также следует выполнить небольшую проверку работоспособности.Хорошей идеей будет проверить, является ли он больше, чем MaxInt, прежде чем пытаться использовать математические преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...