web-dev-qa-db-ja.com

SQL Serverのnumeric、float、decimalの違い

私はGoogleで検索し、また decimalおよびnumeric および /SQL Server Helper にアクセスして、numeric、float、decimalデータ型の違いを調べ、どの状況でどのデータ型を使用するべきかを調べました。

どんな種類の金融取引(例えば給料分野)のために、どれが好まれるか、そして、なぜ?

280
priyanka.sarkar

MSDNのガイドライン: 10進数、浮動小数点数、および実際のデータを使用する

Numericおよびdecimalデータ型のデフォルトの最大精度は38です。Transact-SQLでは、numericは機能的にdecimalデータ型と同等です。 データ値を指定どおりに格納する必要がある場合は、10進数データ型を使用して、数値を小数点付きで格納します。

Floatとrealの動作は、おおよその数値データ型に関するIEEE 754仕様に従います。 floatデータ型と実際のデータ型はおおよその性質のため、金融アプリケーション、丸めを含む演算、または等価性チェックなど、正確な数値動作が必要な場合は、これらのデータ型を使用しないでください。代わりに、integer、decimal、money、またはsmallmoneyの各データ型を使用してください。 WHERE句の検索条件、特に=および<>演算子では、浮動小数点列または実数列を使用しないでください。 floatとrealの列を>または<の比較に制限するのが最善です。

21
kmote

完全な答えではありませんが、便利なリンクです。

「小数値に対して計算を行うことがよくあります。場合によっては、計算の前に小数値をできるだけ早くfloatにキャストすると、精度が向上します。」

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

12
A-K

データ型の優先順位が異なる

10進数 数値 は同じ機能上ですが、まだ データ型の優先順位 があるため、場合によっては非常に重要になります。

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

結果のデータ型は、 数値 です。これは、 データ型の優先順位 を取るためです。

優先順位によるデータ型の完全なリスト:

参照リンク

10
Stephan

10進数は固定精度で、浮動小数点数は可変精度です。

EDIT(質問全体の読み取りに失敗した場合):Float(53)(別名real)は、SQL Serverの倍精度(32ビット)浮動小数点数です。 Regular Floatは単精度浮動小数点数です。倍精度は精度の優れた組み合わせであり、多くの計算において単純化されています。最大136ビットまでの10進数で非常に高精度の数値を作成できますが、必要な桁数までのすべての中間計算を含めることができるように、精度とスケールを正しく定義するように注意する必要があります。

6
Brian Reiter

float は概数データ型です。つまり、データ型の範囲内のすべての値を正確に表現できるわけではありません。

10進数/数値 はFixed-Precisionデータ型です。つまり、データ型の範囲内のすべての値は、精度と位取りで正確に表すことができます。あなたはお金の節約のために小数を使うことができます。

10進数または数値から浮動小数点数に変換すると、精度が多少失われる可能性があります。 DecimalまたはNumericデータ型の場合、SQL Serverは精度と位取りの特定の組み合わせをそれぞれ異なるデータ型と見なします。 DECIMAL(2,2)とDECIMAL(2,4)は異なるデータ型です。これは11.22と11.2222が異なる型であることを意味しますが、これはfloatの場合ではありません。 FLOAT(6)の場合、11.22と11.2222は同じデータ型です。

お金を節約するために money データ型を使用することもできます。これはお金のために4桁の精度を持つネイティブデータ型です。ほとんどの専門家はお金を節約するためにこのデータタイプを好みます。

参照 123

2
Somnath Muluk

この質問にはMONEYデータ型は含まれていませんが、このスレッドに出くわす人は財務計算にMONEYデータ型を使用したいと思うかもしれません。

MONEYデータ型には注意してください。精度には限界があります。

このStackoverflowの質問に対する回答には、それに関する多くの優れた情報があります。

SQL ServerでMONEYまたはDECIMAL(x、y)データ型を選択しますか?

1
Simon Tewsi

10進数の場合

根本的なニーズは何ですか?

それは、結局のところ、コンピュータは内部的にはバイナリ形式で数字を表現するという事実から生じます。これは、必然的に丸め誤差につながります。

このことを考慮:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

省略記号[...]は「無限」を意味します。注意深く見ると、無限の繰り返しパターンがあります(= '0011')。

そのため、ある時点で、コンピューターはその値を丸めなければなりません。これは、不正確に記憶されている数の反復使用から派生する累積誤差につながる。

あなたが財務額(それは小数部分を持っているかもしれない数)を保存したいとしましょう。まず第一に、あなたは明らかに整数を使用することはできません(整数は小数部分を持っていません)。純粋に数学的な観点からは、当然のことながらfloatを使用することになります。しかし、コンピュータでは、浮動小数点数は小数点以下の数字の一部、つまり「仮数」に制限されています。それは丸め誤差につながります。

これを克服するために、コンピュータは10進数のためのコンピュータの2進丸め誤差を制限する特定のデータ型を提供します。これらは、金額を表すために絶対に使用されるべきデータタイプです。これらのデータ型は通常Decimalという名前で移動します。例えばC#の場合です。または、ほとんどのデータベースではDECIMALです。

1
Varus Septimus