2011-01-29 16 views
122

私はMySQLのDECIMALを理解できません。 00.0001から99.9999までの数字を含むことができるように行が必要です。どのように私はそれのように動作するように構造化するだろうか?MySQL DECIMALの使い方は?

+8

*(参考)* http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html –

+4

本当に正しい答えを受け入れるべきです。現在受け入れられている答えは間違っています。 – Olhovsky

+2

ここで終わり、DECIMAL UNSIGNEDは不可能であると主張して答えを読んでください。このための正しい仕様については、下の新しい回答を参照してください。 –

答えて

344

DOUBLE列はDECIMAL列と同じないであり、あなたは財務データのためのDOUBLE列を使用する場合トラブルになります。

DOUBLEは実際にはFLOATの倍精度(32ビットではなく64ビット)のバージョンです。浮動小数点数はreal numbersの近似表現であり、正確ではありません。実際、0.01のような単純な数値は、FLOATまたはDOUBLE型の正確な表現を持っていません。

DECIMAL列は厳密な表現ですが、はるかに小さい範囲の可能な数値のためにもっと多くの領域を占めます。

CREATE TABLE your_table 
(
    your_column DECIMAL(6,4) NOT NULL 
); 

あなたが尋ねたようにあなたは、次のステートメントが必要になり99.9999 0.0001からの値を保持することが可能な列を作成するには、列の定義はMが最大桁数である形式のDECIMAL(M、D)を以下の(精度)およびDは、小数点の右側の桁数です(スケール)。

これは、前のコマンドが-99.9999〜99.9999の値を受け入れる列を作成することを意味します。 UNSIGNED DECIMAL列は、0.0000〜99.9999の範囲で作成することもできます。

MySQL DECIMALの詳細については、official docsは常に素晴らしいリソースです。

この情報はすべて、MySQL 5.0.3以上のバージョンで当てはまります。以前のバージョンを使用している場合は、実際にアップグレードする必要があります。

+15

あなたの答えに投票しました。あなたの答えは正しいです、他の答えではない(それは "二重=小数"と主張しているので)。 DECIMALは正確な値を持つ固定小数点型で、その同義語はNUMERIC、DEC、およびFIXEDです。 DOUBLEは、およその数値データ値を表す浮動小数点型であるため、DOUBLEではありません。 DECIMAL(<1-65>,<0-30>)を使用する場合、最初のパラメータは桁数で、2番目のパラメータは小数点以下の桁数です。 – Norbert

+2

はい、あなたは正しいです。 http://dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html – ajreal

+0

@ajrealのMySQL 5.0.3以降での作業です。それに応じて回答を修正できますか?前もって感謝します。 – dezso

5

10進データ型のMySQL 5.x specificationは、DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]です。上記の答えは、符号なしの小数はできないと言っている間違いです。

符号なし小数点のみを許可するフィールドを定義するには、合計長は6桁で、そのうち4桁は小数です。DECIMAL (6,4) UNSIGNEDを使用します。

同様に、符号なし(つまり、負ではない)FLOATおよびDOUBLEデータ型を作成できます。

32

上記の回答は正しいようですが、どのように動作するかを簡単に説明するだけです。

列がDECIMAL(13,4)に設定されているとします。これは、列の合計サイズが13桁で、4つが精度表現に使用されることを意味します。

ので、要約すると、その列のためにあなたは、の最大値を持っているでしょう:999999999,9999

7

あり、コメントで正しい解決策がありますが、一つの答えにそれらを要約する:

あなたが使用する必要がありますDECIMAL(6,4)。

次に、小数点(尺度)の前に2桁と4桁の合計6桁を持つことができます。少なくともthisによる。

+1

これは、この概念を完全に理解するのに役立ちました。 –

関連する問題