Javascript parseFloat '1.23e-7' дает 1.23e-7, когда необходимо 0.000000123

parseFloat(1.51e-6);
// returns 0.00000151

parseFloat(1.23e-7);
// returns 1.23e-7
// required 0.000000123

Я сортирую столбцы таблицы, содержащие широкий диапазон чисел с плавающей запятой, некоторые из которых представлены в экспоненциальной нотации.

Я использую плагин jQuery tablesorter2.0, который использует parseFloat для ячеек, начинающихся с цифры. Проблема в том, что parseFloat возвращает очень маленькие числа, представленные как 1,23e-7 в виде строки, и не расширяет их до 0,000000123. В результате tableorter сортирует содержимое столбца как текст, а не как числа.

 ** Column To Sort **
2.34
1.01
13,56
1,23e-7

** После сортировки сейчас **
1.01
1,23e-7
13,56
2.34

** Ожидайте **
1,23e-7
1.01
2.34
13,56

Существует ли эффективный способ представления очень маленьких чисел в научной нотации в виде расширенных чисел с плавающей запятой?

Решение:

tableorter определяет, как сортировать столбец на основе первого из автоматических анализаторов таблиц, чтобы вернуть истину для содержимое ячейки в этом столбце. Если ячейка содержала 1,23e-7, то по умолчанию сортировка проводилась по тексту, поскольку синтаксический анализатор 'digit' не интерпретирует это как число.

Таким образом, для обходного пути следующий код представляет число в научной записи как строку, которую может интерпретировать / анализировать как цифру и тем самым обеспечивать числовую сортировку по столбцу. @bitplitter - спасибо за подсказку toFixed ().

var s = "1.23e-7";
// Handle exponential numbers.
if (s.match(/^[-+]?[1-9]\.[0-9]+e[-]?[1-9][0-9]*$/)) {
  s = (+s).toFixed(getPrecision(s));
}
//returns 0.000000123

// Get a nice decimal place precision for the scientific notation number.
// e.g. 1.23e-7 yields 7+2 places after the decimal point
// e.g. 4.5678e-11 yields 11+4 places after the decimal point
function getPrecision(scinum) {
  var arr = new Array();
  // Get the exponent after 'e', make it absolute.  
  arr = scinum.split('e');
  var exponent = Math.abs(arr[1]);

  // Add to it the number of digits between the '.' and the 'e'
  // to give our required precision.
  var precision = new Number(exponent);
  arr = arr[0].split('.');
  precision += arr[1].length;

  return precision;
}
9
задан user187291 7 October 2011 в 01:47
поделиться