圣诞节快乐!
我最近遇到了一个尝试使用 jqGrid 过滤小数字的错误。我正在过滤大小范围从 10 到 1 到 10^(-8) 或更小的数字。我发现它可以很好地过滤这些数字......直到它们变得小于 10^(-6)。
这个数字有什么有趣的地方?从我的控制台(Chrome)查看以下输出:
>e6=.000001
0.000001
>e7=.0000001
1e-7
这是浏览器(或 JavaScript)开始使用科学记数法的时候。
没有进一步的告别,这是演示该错误的代码。
$(document).ready(function() {
var smallnumbers = {
values: [
{value: 100, text: "100"},
{value: 10, text: "10"},
{value: 1, text: "1"},
{value: .1, text: "10^(-1)"},
{value: .01, text: "10^(-2)"},
{value: .001, text: "10^(-3)"},
{value: .0001, text: "10^(-4)"},
{value: .00001, text: "10^(-5)"},
{value: .000001, text: "10^(-6)"},
{value: .0000001, text: "10^(-7)"},
{value: .00000001, text: "10^(-8)"},
{value: .000000001, text: "10^(-9)"},
{value: .00000000001, text: "10^(-10)"},
]
};
var myfilter = {
groupOp: "OR",
rules: [
{field: 'value', op: 'lt', data: 1}
]
};
var grid = $('#demo').jqGrid({
datatype: 'local',
colNames: ['Value', 'Text'],
colModel: [
{
name: 'value',
index: 'value',
width: '100'
},
{
name: 'text',
index: 'text',
width: 100
}
],
data: smallnumbers.values,
width: 500,
height: '100%',
pager: '#pager',
viewrecords: true,
caption: 'Bug with filtering small numbers',
search: true,
postData: {
filters: myfilter
}
});
});
JavaScript 能够对小于 10^(-6) 的数字执行分支语句,如下所示:
> if (e7 < 1) { console.log("This should appear"); }
This should appear
> if (e7 > 1) { console.log("This should not appear"); }
>
但似乎 jqGrid 不是!
是什么赋予了?此错误的一种解决方法是将小数字向上舍入,只要边界始终大于它们四舍五入的值。但我仍然想知道发生了什么。是时候看看源代码了……