web-dev-qa-db-ja.com

SQL Serverの「MONEY」データ型は10進浮動小数点ですか、それとも2進浮動小数点ですか。

SQLServerの「MONEY」データ型が10進浮動小数点であるか2進浮動小数点であるかを拒否または確認するものは見つかりませんでした。

説明では、MONEYタイプの範囲は-2 ^ 63から2 ^ 63 -1であると記載されているため、この種の場合は、バイナリ浮動小数点である必要があります。

しかし このページ では、MONEYが「正確な」数値としてリストされています。 MONEYが10進浮動小数点である可能性があることを示唆するのはどの種類ですか(そうでない場合、それはどのように正確ですか?または正確の定義は何ですか?)

次に、MONEYが10進数の浮動小数点である場合、MONEYとDECIMAL(19,4)の違いは何ですか?

16
kaptan

どちらでもない。浮動小数点の実装である場合、FLOATおよびREALタイプと同じ不正確さの影響を受けます。ウィキペディアの 浮動小数点 を参照してください。

MONEYは 固定小数点 タイプです。

(-10 ^ 15 +1から10 ^ 15-1)とは対照的に、範囲(922,337,203,685,477.5808から922,337,203,685,477.5807)が小さいため、DECIMAL(19,4)よりも1バイト小さくなります。

26
hobodave

違いを確認するには、ドキュメントを参照してください。

お金 のドキュメント:

Data type  Range                                                 Storage
money      -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes
smallmoney -214,748.3648 to 214,748.3647                         4 bytes

お金と小額のデータ型は、それらが表す通貨単位の1万分の1まで正確です。

10進数 と比較してください:

最大精度を使用する場合、有効な値は-10 ^ 38 +1から10 ^ 38-1までです。

Precision    Storage
1 - 9        5 bytes
10 - 19      9 bytes
20 - 28      13 bytes
29 - 38      17 bytes

したがって、それらは完全に同等ではなく、ただ類似しています。 DECIMAL(19,4)の範囲はMONEYよりもわずかに大きくなります(-10 ^ 15 +0.0001から10 ^ 15 --0.0001まで格納できます)が、さらに1バイトのストレージが必要です。

言い換えれば、これは機能します:

CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1 

999999999999999.9999

しかし、これはしません:

CREATE TABLE Table1 (test MONEY NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1 

Arithmetic overflow error converting numeric to data type money.

セマンティックの違いもあります。金銭的価値を保存したい場合は、moneyタイプを使用するのが理にかなっています。

10
Mark Byers

主な違いは、必要なストレージスペースだと思います。

DECIMAL(19,4)には9ストレージバイトが必要です

MONEYには8ストレージバイトが必要です

3
Dancrumb