1

pi の diff 値を挿入しました (以下を参照)。

3.14 
3.1415 
3.14159
3.14159265359 

異なる浮動小数点型が同じ値を処理する方法に違いはありません。

コード:

mysql> select * from test_types;
+---------+---------+---------+----------+
| flo     | dub     | deci    | noomeric |
+---------+---------+---------+----------+
| 3.14000 | 3.14000 | 3.14000 |  3.14000 |
| 3.14150 | 3.14150 | 3.14150 |  3.14150 |
| 3.14159 | 3.14159 | 3.14159 |  3.14159 |
| 3.14150 | 3.14150 | 3.14150 |  3.14150 |
| 3.14159 | 3.14159 | 3.14159 |  3.14159 |
+---------+---------+---------+----------+
5 rows in set (0.00 sec)

mysql> describe test_types;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| flo      | float(10,5)   | YES  |     | NULL    |       |
| noomeric | decimal(10,5) | YES  |     | NULL    |       |
| deci     | decimal(10,5) | YES  |     | NULL    |       |
| dub      | double(10,5)  | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

ここで、テーブルを作成するときに、数値型のフィールドが DECIMAL を使用していることがわかります (describe コマンド テーブルを参照)。

FLOAT、DECIMAL、DOUBLEの違いを示す例を知っている人はいますか?

4

1 に答える 1

2

FLOATDOUBLEは、非常に小さな値または非常に大きな値を対象としています。

基本的に、それらは同じものです (記憶域サイズ FLOAT 4 バイトと DOUBLE 8 バイトが異なることを除いて、データ型記憶域の要件を参照してください) 。

それらについての主なことは、それらが概算であることです(Oracle Webサイトからの引用を参照):

浮動小数点値は近似値であり、正確な値として格納されないため、比較で正確な値として処理しようとすると問題が発生する可能性があります。また、プラットフォームまたは実装の依存関係にも左右されます。

DECIMALは正確な表現を可能にしますが、DECIMAL列が PI でうまく機能しなかった理由は、小数点以下 5 桁までしか許可していなかったのに、小数点以下 11 桁を入力したためです。

PI の値を小数点以下 11 桁まで正確に格納する最良の方法は、次のようなものDECIMAL(12,11)です。

同じ値がFLOATとして格納および使用されるのとは対照的に、 DECIMALとして格納されたときに値が異なる方法で扱われる実際の例については、以下を参照してください。

CREATE TABLE decimal_vs_float_test
( dec DECIMAL(12,11)
, fl FLOAT
);

INSERT INTO decimal_vs_float_test VALUES
  ( 3.947947949 , 3.947947949 )
 ,( 3.777777777 , 3.777777777 )
 ,( 3.555555555 , 3.555555555 )
 ,( 3.333333333 , 3.333333333 )
 ,( 3.111111111 , 3.111111111 ) 
 ;

SELECT * FROM decimal_vs_float_test WHERE fl = dec

これで、 DECIMALまたはFLOATの値が異なる方法で処理されていることがわかります。

それが役立つことを願っています。

さらに、 FLOATDOUBLEは浮動小数点型ですが、 DECIMALは浮動小数点型です。

それが何を意味するか、型がどのようにエンコードされているか、いつどの型を使用するのが最適かの違いについてのより正確な詳細については、この回答を参照してください(C#を意味しますが、それでも興味深いです)。

于 2013-01-31T09:01:38.987 に答える