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。
结果,表排序器将列的内容排序为文本而不是数字。



有没有一种有效的方式将非常小的科学计数法表示为扩展的浮点数?

解决方案:

tablesorter确定如何基于第一个tablesorters自动解析器对列进行排序,以对该列中单元格的内容返回true。
如果该单元格包含1.23e-7,则默认不按文本排序,因为“数字”解析器不会将其解释为数字。

因此,要解决此问题,以下代码将科学计数法表示为字符串,表排序程序可以将其解释/解析为数字,从而确保对列进行数字排序。 @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;
}

最佳答案

即使OP发布了他的解决方案,我还是想分享一个偶然发现的更简单的解决方案,该解决方案基于表排序器source code中的解析器和JasonS在another question上给出的正则表达式。

// add parser through the tablesorter addParser method
$.tablesorter.addParser({
// set a unique id
id: 'scinot',
is: function(s) {
    return /[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/.test(s);
},
format: function(s) {
    return $.tablesorter.formatFloat(s);
},
type: 'numeric'
});
它几乎可以用科学计数法给出的所有值在我的 table 上工作。它会自动检测(is:部分)并正确地对多个字段进行排序。
希望它对可能偶然发现此问题的其他人有所帮助。

关于Javascript parseFloat '1.23e-7'在需要0.000000123时给出1.23e-7,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4126206/

10-10 19:59