web-dev-qa-db-ja.com

何がSQL Serverのダブルを表しますか?

C#にはdoubleという2つのプロパティがあり、それらをSQL Serverのテーブルに格納したいのですが、double型がな​​いことに気付いたので、decimalまたはfloatを使用するのが最善です。

これは緯度と経度の値を格納するので、私は最も正確な精度が必要です。

これまでの回答をありがとう。

302
Xaisoft
float

またはあなたが昔の学校に行きたいのなら:

real

Float(53)を使うこともできますが、これはfloatと同じことを意味します。

( "real"はfloat(24)と等価で、float/float(53)とは等価ではありません。)

SQL Serverのdecimal(x、y)型は、浮動小数点数ではなくexactdecimal数(概数になります)が必要な場合に使用します。これは、128ビットの浮動小数点数に近いC#の "decimal"データ型とは対照的です。

MSSQLfloatは、.NETの64ビットdouble型と同じ精度厳密にを持ちません(わずか仮数IIRCの違い)が、それはほとんどの用途のための十分に近い一致です。

さらにわかりにくくするために、C#の "float"は32ビットにすぎません。そのため、SQLではMSSQLのreal/float(24)型にfloat/float(53)よりも同等です。

あなたの特定のユースケースでは...あなたが必要とするのは緯度と経度を約1メートルの精度で表現するために小数点の後の5つの場所だけです。度数の小数点。 MSSQLでのfloat(24)またはdecimal(8,5)は、ニーズに最も適しています。C#でfloatを使用すれば十分であり、doubleは不要です。実際、あなたのユーザーはおそらく、乗るために無意味な数字が並んでいるのではなく、小数点以下第5位に丸めてくれてありがとう。

355
richardtallent

SQL ServerへのCLRデータ型マッピングは次のとおりです。 http://msdn.Microsoft.com/ja-jp/library/system.data.sqldbtype.aspx

47
Achilles

また、 here はSQL-CLR型マッピングの便利なチャート付きの良い答えです。

その投稿から( David まで): enter image description here

47
Mazdak Shojaie

floatは最も近いものです。

SqlDbType列挙体

編集する

OPが述べたように、Lat/Longの場合。

メートルは緯度の1/4,000,000、1秒はおよそ30メートルです。フロート/ダブルで15の有効数字が得られます。いくつかの素早いそして面倒な暗算では、四捨五入/近似エラーは、このフィルストップの長さ程度になります - > "。

14
gbn

他のほとんどの人が指摘したように、floatは正解です。詳細については、 MicrosoftのSQL Serverに関するドキュメント - CLRデータ型マッピング を参照してください。

14

あなたはそれをFLOAT(53)にマップするべきです - それが LINQ to SQLがすることです

9
RichardOD

SQL Serverのfloatは実際には(C#の意味で) "double"の精度を[編集:ほぼ]持ちます。

floatfloat(53)の同義語です。 53は仮数のビットです。

.NET doubleは仮数に54ビットを使用します。

7
Euro Micelli

SQL Serverの場合

Decimal Typeは128ビットの符号付き数値ですFloatは64ビットの符号付き数値です。

本当の答えはフロートです、私は10進数については間違っていました。

その理由は、10進数を使用した場合、10進数の64ビットがいっぱいになることは決してないからです。

あなたはint型を使用しようとした場合10進数はあなたにエラーを与えることはありませんが。

ここで はタイプのいい参照チャートです。

5
David Basarab

MSDNには 素晴らしいスレッドがあり 、FLOATとDECIMALの主な違いが説明されています。つまり、Floatは近似値であり、一部の値を表すことはできません。

受け入れられた答えを見てください。

5
Matthew Jones

@アキレス素晴らしい! TinyIntのために滞在したダブルのためにここに来ました。

これはdataTableとSQLの間で変換するための部分的に行われたスイッチケースです:

switch (columnDataTypeList[i])
{
    case "System.String":
        columnDataTypeList[i] = "VARCHAR(MAX)";
        break;
    case "System.Int32":
        columnDataTypeList[i] = "INT";
        break;
    case "System.DateTime":
        columnDataTypeList[i] = "DATE";
        break;
    case "System.Double":
        columnDataTypeList[i] = "FLOAT";
        break;
}

文字列はあなたの必要に応じてそれを編集することを忘れないで問題になる可能性がありますが、手元の問題である二重はうまくいくはずです。

3
JPK

あなたが選ぶことができるように聞こえます。 floatを選ぶと、11桁の精度を失う可能性があります。それが許容できる場合は、それを試してください - どうやらLinqのデザイナーはこれが良いトレードオフだと思っていました。

ただし、アプリケーションでこれらの追加の桁数が必要な場合は、decimalを使用してください。とにかく、10進数(正しく実装されたもの)はfloatよりもはるかに正確です。つまり、10進数から2進数、およびその逆への面倒な変換はありません。

2
DaveN59

System.Data.Sqlクラスには既にマッピングがありませんか?

参照: C#:.NET FrameworkのSQL Serverデータ型と同等のもの

さて、私のものをフロートにしましょう...

1
Dan Diplo

これが役に立つ場合には、以下が私が通常参照するリンクです(私は今回初めてのGoogleでこのスレッドに行き着きました!)。

SqlDataReaderの手順と列挙型が示されているので(.NETとSQLの型の比較に加えて)、以前のリンクに追加された情報が含まれています。

https://docs.Microsoft.com/ja-jp/dotnet/framework/data/adonet/sql-server-data-type-mappings

(そしてそうフロート!)

1
d219