C#
にはdouble
という2つのプロパティがあり、それらをSQL Serverのテーブルに格納したいのですが、double
型がないことに気付いたので、decimal
またはfloat
を使用するのが最善です。
これは緯度と経度の値を格納するので、私は最も正確な精度が必要です。
これまでの回答をありがとう。
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位に丸めてくれてありがとう。
SQL ServerへのCLRデータ型マッピングは次のとおりです。 http://msdn.Microsoft.com/ja-jp/library/system.data.sqldbtype.aspx
floatは最も近いものです。
編集する
OPが述べたように、Lat/Longの場合。
メートルは緯度の1/4,000,000、1秒はおよそ30メートルです。フロート/ダブルで15の有効数字が得られます。いくつかの素早いそして面倒な暗算では、四捨五入/近似エラーは、このフィルストップの長さ程度になります - > "。
他のほとんどの人が指摘したように、float
は正解です。詳細については、 MicrosoftのSQL Serverに関するドキュメント - CLRデータ型マッピング を参照してください。
あなたはそれをFLOAT(53)にマップするべきです - それが LINQ to SQLがすることです 。
SQL Serverのfloat
は実際には(C#の意味で) "double"の精度を[編集:ほぼ]持ちます。
float
はfloat(53)
の同義語です。 53は仮数のビットです。
.NET double
は仮数に54ビットを使用します。
SQL Serverの場合
Decimal Typeは128ビットの符号付き数値ですFloatは64ビットの符号付き数値です。
本当の答えはフロートです、私は10進数については間違っていました。
その理由は、10進数を使用した場合、10進数の64ビットがいっぱいになることは決してないからです。
あなたはint型を使用しようとした場合10進数はあなたにエラーを与えることはありませんが。
ここで はタイプのいい参照チャートです。
MSDNには 素晴らしいスレッドがあり 、FLOATとDECIMALの主な違いが説明されています。つまり、Floatは近似値であり、一部の値を表すことはできません。
受け入れられた答えを見てください。
@アキレス素晴らしい! 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;
}
文字列はあなたの必要に応じてそれを編集することを忘れないで問題になる可能性がありますが、手元の問題である二重はうまくいくはずです。
あなたが選ぶことができるように聞こえます。 floatを選ぶと、11桁の精度を失う可能性があります。それが許容できる場合は、それを試してください - どうやらLinqのデザイナーはこれが良いトレードオフだと思っていました。
ただし、アプリケーションでこれらの追加の桁数が必要な場合は、decimalを使用してください。とにかく、10進数(正しく実装されたもの)はfloatよりもはるかに正確です。つまり、10進数から2進数、およびその逆への面倒な変換はありません。
System.Data.Sqlクラスには既にマッピングがありませんか?
参照: C#:.NET FrameworkのSQL Serverデータ型と同等のもの 。
さて、私のものをフロートにしましょう...
これが役に立つ場合には、以下が私が通常参照するリンクです(私は今回初めてのGoogleでこのスレッドに行き着きました!)。
SqlDataReaderの手順と列挙型が示されているので(.NETとSQLの型の比較に加えて)、以前のリンクに追加された情報が含まれています。
https://docs.Microsoft.com/ja-jp/dotnet/framework/data/adonet/sql-server-data-type-mappings
(そしてそうフロート!)