4

Ubuntu9.04でMySql5.0を使用しています。フルバージョンは次のとおりです。5.0.75-0ubuntu10

テストデータベースを作成しました。そしてその中のテストテーブル。挿入ステートメントから次の出力が表示されます。

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test value(858147.11);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test;
+-----------+
| floaty    |
+-----------+
| 858147.12 | 
+-----------+
1 row in set (0.00 sec)

mySqlで設定されたスケール/精度に問題があるようです...または私は何かを逃しましたか?

アップデート:

挿入していた数値の1つに境界が見つかりました。コードは、次のとおりです。

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test value(131071.01);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test value(131072.01);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test;
+-----------+
| floaty    |
+-----------+
| 131071.01 | 
| 131072.02 | 
+-----------+
2 rows in set (0.00 sec)

mysql> 
4

2 に答える 2

11

フェイスパーム!!!!

フロートは、仮数と指数として格納される32ビットの数値です。MySqlがストレージをどのように分割するかは100%わかりませんが、Javaを例にとると、符号付き仮数に24ビット、指数(科学的記数法)に8ビットを使用します。これは、FLOATが持つことができる最大値が+ 8388608 * 10 ^ 127であり、最小値が-8388608 * 10^127であることを意味します。これは有効数字7桁のみを意味し、私のFLOAT定義は8を使用しました。

これらすべての8,2をFLOATからDOUBLEに切り替えます。

于 2009-05-22T15:49:08.307 に答える
2

MySQLのドキュメントには、「MySQLは値を格納するときに丸めを実行する」と記載されており、これがここでの問題であると思われます。問題を複製しましたが、ストレージタイプをDOUBLEに変更しました。

CREATE TABLE test (val, DOUBLE);

取得した値は、指定したテスト値と一致しました。

私の提案は、その価値については、DOUBLEまたはおそらくDECIMALを使用することです。私は同じ元のテストを次のように試しました:

CREATE TABLE test (val, DECIMAL(8,2));

そしてそれは私がそれに与えた値を取得しました:858147.11。

于 2009-05-22T15:38:41.913 に答える