0

長さ 17 文字の車両の VIN 番号 (VID として保存) を保存するデータベースがあります。データベースに新しい車両を追加できるページに表示するために、次の 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 

ここで何が起こっているのかわかりません。PHPフロートマニュアルによると:

"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
4

1 に答える 1

0

VID番号は、「double」や「integer」などのように見える場合がありますが、そうではありません。文字列として保存します。説明については、 VimeoのSkeetをチェックしてください。6:10頃に始まり、10:00頃に終わります。

DBのbigintでもかまいませんが、doubleは浮動小数点であり、浮動小数点は離散数として使用するためのものではありません。それが彼らがフローティングポイントである理由です。私は、データベースに至るまで、文字列(varchar)を使用します。bigintを使用すると、あなたや他の開発者はそれを「数字」として扱い続けるようになりますが、実際にはそうではありません(正確には)。

于 2012-04-05T00:50:50.943 に答える