Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQL中带有大双精度的奇怪行为_Php_Mysql - Fatal编程技术网

PHP MySQL中带有大双精度的奇怪行为

PHP MySQL中带有大双精度的奇怪行为,php,mysql,Php,Mysql,我有一个数据库,存储车辆识别号(VIN)作为车辆识别码(VID)存储,长度为17个字符。我正在尝试增加到下一个视频,以便将其显示在可以在数据库中添加新车辆的页面上。数据库中的VID字段类型为bigint17,并设置了自动增量 $incr_query = "SELECT MAX(VID) FROM Vehicle"; $incr_result = mysql_query($incr_query); $row = mysql_fetch_assoc($incr_result); $vid = $ro

我有一个数据库,存储车辆识别号(VIN)作为车辆识别码(VID)存储,长度为17个字符。我正在尝试增加到下一个视频,以便将其显示在可以在数据库中添加新车辆的页面上。数据库中的VID字段类型为bigint17,并设置了自动增量

$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 
我不知道这里发生了什么。根据报告:

编辑:

因此,使用bcadd,以下是输出:

$vid = bcadd($vid, '1', 0); 
print "\n".$vid;                              //12345678123456789
print "\n".number_format($vid, 0, '.', '');   //12345678123456788
VID数字可能看起来像一个双精度或整数或其他什么,但它不是。将其存储为字符串。查看解释。大约6点10分开始,10点左右结束


DB中的bigint可以,但double是A,浮点用作离散数;这就是为什么它们是浮点。我会一直使用字符串varchar,直到数据库。使用bigint会鼓励您/其他开发人员继续将其视为一个数字,事实上,它并不准确。

嗯,它似乎不够准确?这个数字超过14位,所以这个估计似乎适用于您的架构。我明白您所说的离散与连续的含义。如果我在数据库和脚本中将其更改为字符串,我如何增加它?您可以选择将bigint保留在数据库中,以便让数据库处理自动增加。如果这样做,请确保在应用程序中使用字符串。如果您一直使用string/varchar,您将需要更多的applicationlogic来增加数字,例如,在from或from的帮助下。我更新了我的问题。由于某种原因,number\u格式仍然输出相同的值。因为number\u格式尝试将传递给它的值转换为某种形式的number double,然后尝试对其进行格式化。number_格式不用于格式化bc_bignumbers的字符串@我真的不明白你为什么要用数字格式;您正在传递以下参数:字符串$vid,然后0代表0位小数,“.”对于小数分隔符,它没有任何用处,因为您不需要小数,请参阅上一个传入的参数,以及一个空的千位分隔符,它将导致不使用千位分隔符。那么为什么还要麻烦使用数字格式呢?我检查了一下,试图将第一个参数转换为float。
$vid = bcadd($vid, '1', 0); 
print "\n".$vid;                              //12345678123456789
print "\n".number_format($vid, 0, '.', '');   //12345678123456788