メリークリスマス!
最近、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はそうではないようです!
何が得られますか?このバグの回避策の1つは、境界が常に丸める値よりも大きい限り、小さい数値を切り上げることです。しかし、私はまだ何が起こっているのか知りたいです。ソースコードを見てみましょう...