2012-01-09 61 views
0

我有我的數據庫中的類型浮點數和值爲0.0的字段半徑。SQL更新和設置與浮點數

通過一個PHP sript我改變它的值d2的內容​​,這種說法,以32.422:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` + ".$d2." WHERE `index` = '".$index."'"); 

如果以後我用另一個PHP腳本,以減少相同數量的半徑值:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` - ".$d2." WHERE `index` = '".$index."'"); 

最終值不是0,它應該是,但1.4988E-9 ...幾乎爲零。

誰能告訴我我做錯了什麼?

感謝, Direz

+0

您更好地使用'double',而不是'float'。 – a1ex07 2012-01-09 17:38:33

回答

1

有沒有錯,你只是seing浮點數的限制。

你認爲的確切值32.422並非如此。當從查詢中的文本表示轉換爲數據庫使用的浮點數時,它將成爲使用該數據類型可能表示的最接近的數字。它可能類似32.421999995662,非常接近32.422,但不完全一樣。

每個浮點值可能包含您想要的值的偏差,當您使用它們進行計算時,偏差加起來,過了一段時間後您會看到差異。

通常情況下,這些小差異是不可見的,因爲當您顯示數字時,數字四捨五入爲合理數字。例如,如果您在第二個查詢中減去31.422,則最終會得到非常接近1的值,例如1.00000000014988,當您顯示該值時,該值將被舍入爲1.000000000。當你得到一個接近於零的值時,沒有明顯大於它可以舍入的偏差的值,所以你只能看到偏差。

+0

感謝您的優秀解釋! – 2012-01-09 21:23:28