PHP MySQL中使用大双精度的奇怪行为

时间:2012-04-05 00:45:03

标签: php mysql

我有一个存储VIN号码(存储为VID)的数据库,用于长度为17个字符的车辆。我正在尝试增加到下一个VID,以便在可以在数据库中添加新车辆的页面上显示它。数据库中的VID字段是bigint类型(17)并且设置了auto_increment。

$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 

我不确定这里发生了什么。根据{{​​3}}:

"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

1 个答案:

答案 0 :(得分:0)

VID号可能看起来,如“双”或“整数”或其他什么,但不是。将其存储为字符串。查看Skeet on Vimeo以获取解释。它从6点10分左右开始,到10点左右结束。

数据库中的bigint可能会这样做,但是double是floating point,浮点数not intended可以用作离散数字;这就是为什么他们是浮点数。我会一直使用string(varchar),直到数据库。使用bigint会鼓励你/其他开发人员继续将它视为“数字”,事实上,它并非(确切地说)。