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;
}