2011-04-14 45 views
1

我有一個PHP腳本插入MySQL數據庫中的行。每行都有一個字段'created_at',它填充了PHP函數microtime(true)的值,並以雙精度插入。 (microtime,因爲我需要比第二個更精確的東西)MySQL比microtime時間戳大

我有另一個PHP腳本,根據created_at字段選擇行。

當我繼續前進,選擇這樣的: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 我收到一個結果,作爲第一行,該行與爲created_at正是價值

這發生在我的PHP腳本和手動執行查詢時從PhpMyAdmin內。但並非總是如此,並非爲了每一個價值。真是一次又一次。

這怎麼可能?我沒有要求大於/等於,我要嚴格大於。 我可以忽略類型相關的東西嗎?

+0

非常感謝所有(非常快)的回覆。我現在明白這個問題好多了。我想我會轉換爲int來緩解任何舍入問題,這當然應該做到這一點。 再次感謝! – Dieter 2011-04-14 13:16:18

回答

4

是的,浮點算術有時可以做到這一點。爲了理解爲什麼,有必要認識到,並非所有的數字都能以10爲基準準確地表示,也不是所有的數字都能以2爲基準準確表示。

例如,「1/3」可以在基數10中寫爲0.33333或0.33334。它們都不是真正的「正確」;他們只是我們能做的最好的。基數10中的「DOUBLE」可能是0.3333333333或0.3333333334,它是數字的兩倍,但仍不「正確」。

,最好的選擇是要麼使用小數值,或才能使用INT值(和乘以你的實際值,也就是說,10000或100000〜讓你在乎成INT十進制數字)。

4

DOUBLE類型僅表示近似的數值數據值。嘗試使用DECIMAL類型。

2

是你的列浮點數嗎?使用true調用microtime將爲您提供一個浮點數,並且看起來像一個浮點數,它將在.51878之後有數字,您沒有看到,所以這些數字使存儲的值大於查詢中的值。

除非你真的需要浮點數,否則我會將字符串結果轉換爲一個int,甚至兩列,秒和useconds。然後您可以使用已知值上的>或<,而不必擔心浮點值的不精確性。

+0

歡迎來到SO。我刪除了你的個人筆記,因爲這在社區中通常會被忽視。沒有什麼個人的。另請參閱常見問題解答。乾杯 – 2011-04-14 13:14:26

+0

謝謝@Joris Meys - 沒問題。 – 2011-04-14 13:35:13