2009-05-22 10 views
4

私たちはUbuntu 9.04でMySql 5.0を使用しています。完全版は:5.0.75-0ubuntu10MySqlのFLOATデータ型と7桁スケールの問題

私はテストデータベースを作成しました。その中にテストテーブルがあります。私は、INSERT文から次の出力を参照してください。

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で設定スケール/高精度に問題が発生しましたか私は何を逃したのですか?

UPDATE:

私たちが挿入された番号のいずれかの境界は、ここのコードですが見つかり:

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> 
+0

5.067 MySQLを実行している私のWindowsボックスでは、実際に858147.13を取得します。 – itsmatt

答えて

9

Face Palm !!!!

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

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

1

MySQLのドキュメントは、「MySQLは値を格納する際に丸め実行」に言及し、私はこれがある疑いがありますここの問題。私はあなたの問題を重複しますがDOUBLEするストレージタイプを変更:

CREATE TABLE test (val, DOUBLE); 

と取り出された値は、指定したテスト値と一致しました。

私の提案は、それが価値があるものとして、DOUBLEまたはDECIMALを使用することです。私は、同じ元のテストを試みた:

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

、それは私はそれを与えた値取得:858147.11を。