2012-04-05 63 views
0

我有一個數據庫存儲車輛的長度爲17個字符的VIN號碼(存儲爲VID)。我正在嘗試增加到下一個VID以將其顯示在可以在數據庫中添加新車輛的頁面上。數據庫中的VID字段輸入bigint(17)並設置了auto_increment。在PHP中有大的雙倍行爲奇怪的行爲MySQL

$incr_query = "SELECT MAX(VID) FROM Vehicle"; 
$incr_result = mysql_query($incr_query); 
$row = mysql_fetch_assoc($incr_result); 
$vid = $row["MAX(VID)"] + 1; 

輸出:

print var_dump{$row);//array(1) { ["MAX(VID)"]=> string(17) "12345678123456788" } 
print gettype($vid); //double 
print $vid;    //1.2345678123457E+16 
print number_format(++$vid, 0, '.', '');  //12345678123456788 
print number_format(--$vid, 0, '.', '');  //12345678123456788 
print number_format($vid - 5, 0, '.', '');  //12345678123456784 

我不知道是怎麼回事。按照PHP float manual

"The size of a float is platform-dependent, although a maximum of ~1.8e308 with 
a precision of roughly 14 decimal digits is a common value" 

編輯:

因此,使用bcadd,這些都是輸出:

$vid = bcadd($vid, '1', 0); 
print "\n".$vid;        //12345678123456789 
print "\n".number_format($vid, 0, '.', ''); //12345678123456788 
+0

嗯,它不夠準確,看起來?這個數字超過14位數,所以估計似乎適用於你的架構 – 2012-04-05 00:48:54

回答

0

的VID號可能看起來像一個 「雙」 或「整數「或其他什麼,但它不是。將其存儲爲字符串。請查看Skeet on Vimeo獲取解釋。它從6點10分左右開始,在10點左右結束。

數據庫中的bigint可能會這樣做,但雙精度值是floating point,而浮點數是not intended可用作離散數字;這就是爲什麼他們是浮點。我會一直使用字符串(varchar),直到數據庫。使用bigint會鼓勵您/其他開發人員繼續將其視爲一個「數字」,事實上,它不是(完全)。

+0

我明白你的意思是關於離散還是連續。如果我將它更改爲數據庫和腳本中的字符串,我該如何增加它? – gwely 2012-04-05 01:41:34

+0

您可以選擇將bigint保存在數據庫中,以便讓DB處理(自動)增量(ing)。如果你這樣做,確保你在應用程序中使用'string'。如果你要按照[先前的建議](http://riii.nl/ftew5)的要求將'string' /'varchar'設置爲全部,你需要多一點(應用程序)邏輯來增加(例如,[BC Math]](http://www.php.net/manual/)的[bcadd](http://www.php.net/manual/en/function.bcadd.php)來自[GMP](http://www.php.net/)的[en/book.bc.php]或[gmp_add](http://www.php.net/manual/en/function.gmp-add.php)手動/ EN/book.gmp.php)。 – RobIII 2012-04-05 01:46:01

+0

我更新了我的問題。由於某種原因,number_format仍然輸出相同的值。 – gwely 2012-04-05 01:53:28