1

MySQL データベースに行を挿入する 1 つの PHP スクリプトがあります。各行には「created_at」フィールドがあり、PHP 関数 microtime(true) の値が入力され、double として挿入されます。(秒よりも正確なものが必要なため、マイクロタイム)

その created_at フィールドに基づいて行を選択する別の PHP スクリプトがあります。

先に進んで次のように選択すると: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 最初の行として、 created_at の値とまったく同じ行を含む結果セットを受け取ります。

これは、クエリを手動で実行するときに、PHP スクリプト内および PhpMyAdmin 内から発生します。しかし、常にではなく、すべての値に対してではありません。本当にたまにです。

これはどのように可能ですか?私はより大きい/等しいを求めませんでした。厳密にはより大きいことが必要です。おそらくタイプ関連の何かを見落としていますか?

4

3 に答える 3

4

DOUBLE 型は、おおよその数値データ値のみを表します。DECIMAL 型を使用してみてください。

于 2011-04-14T12:56:57.113 に答える
4

ええ、浮動小数点演算は時々それを行うことができます。理由を理解するには、基数 10 ですべての数値を正確に表現できるわけではないのと同様に、基数 2 でもすべての数値を正確に表現できるわけではないことを理解しておくと役に立ちます。

たとえば、「1/3」は 10 進数で 0.33333 または 0.33334 と表記される場合があります。どちらも実際には「正しい」わけではありません。それらは私たちができる最善のことです。基数 10 の "DOUBLE" は 0.3333333333 または 0.3333333334 である可能性があり、これは 2 桁ですが、それでも「正しく」ありません。

最適なオプションは、DECIMAL値を使用するか、INT値を使用することです (実際の値に 10000 または 100000 を掛けて、必要な 10 進数をその int に変換します)。

于 2011-04-14T13:01:36.007 に答える
2

あなたの列は浮動小数点ですか?trueを指定してmicrotimeを呼び出すと、floatが得られます。これは、floatのように見えます。これは、.51878の後に数字が表示されないため、これらの数字により、保存されている値がクエリの値よりも大きくなります。

本当にfloatが必要でない限り、文字列の結果をintに変換するか、秒とu秒の場合は2列に変換します。次に、浮動小数点値の不正確さを気にせずに、既知の値に>または<を使用できます。

于 2011-04-14T13:00:07.650 に答える