SQLサーバーでdoubleを表すものは何ですか?


335

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

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

これまでの回答に感謝します。


SQL ServerへのCLRデータ型マッピングは次のとおりです。http
Achilles

MSDNには、FLOATとDECIMALの主な違いを説明する素晴らしいスレッドがあります。つまり、Floatは概算であり、一部の値を表すことができません。受け入れられた答えを見てください。
マシュージョーンズ

回答:


387
float

または、古い学校に行きたい場合:

real

float(53)も使用できますが、floatと同じ意味です。

( "real"は、float / float(53)ではなく、float(24)と同等です。)

小数(x、y)は SQL Serverのタイプは、あなたがしたいときのためにある正確な進数ではなく、(近似することができます)浮動小数点を。これは、128ビットの浮動小数点数に似たC#の「10進数」データ型とは対照的です。

MSSQLのfloat型は、.NETの64ビットdouble型と同等です。(2011年の私の元の回答では、仮数にわずかな違いがある可能性があると述べていましたが、2020年にテストしましたが、非常に小さい数値と非常に大きい数値の両方のバイナリ表現で100%互換性があるようです-https:/を参照してください/dotnetfiddle.net/wLX5Ox(私のテスト用)。

混乱を招くために、C#の "float"は32ビットにすぎないため、SQLでは、float / float(53)よりもMSSQLのreal / float(24)型に相当します。

特定の使用例では... 緯度と経度を約1メートルの精度で表すために必要なのは小数点以下5桁であり、度数は小数点の前に最大3桁必要です。Float(24)またはdecimal(8,5)はMSSQLでのニーズに最適であり、C#でのfloatの使用で十分です。doubleは必要ありません。実際、ユーザーは、乗車時に重要でない数字の束を用意するのではなく、小数点以下5桁に四捨五入してくれることに感謝するでしょう。


1
あなたはフロートを言う、デビッドは10進数を言う、今私はさらに混乱しています:)
Xaisoft 2009

私はc#でdoubleを使用しています。これらの値は、それぞれの列の緯度と経度の値になります。
Xaisoft 2009

1
私は同意しなければなりません、そして私がベースから外れていたことを認めます。IBM DB2の世界でdecimalが紹介されました。decimalは実際のデータ型であり、IBMプラットフォーム上のすべての種類のコードとデータベースでサポートされています。MSの世界では実際のデータ型ではありませんが、IBMキャンプほどサポートされていません。混乱を招いて申し訳ありません。
DaveN59 2009

2
「MSSQL floatは、.NETの64ビットdouble型と正確に同じ精度ではありません(仮数IIRCのわずかな違い)が、ほとんどの場合、十分に近い一致です。」これについてのリファレンスはありますか?私の知る限り見ることができるように、両方の使用仮の53ビットは、保存のために64ビットを使用し、同一のビットレイアウトを有し、IEEE 754としての意味
codekaizen

2
@codekaizen(仮数のわずかな違い)によって提起された質問にもかなり興味があります。これを例示するリファレンスまたはテストはありますか?
Mads Ravn


15

floatは最も近いものです。

SqlDbType列挙

OPで言及した緯度/経度の場合。

メートルは緯度の1 / 40,000,000、1秒は約30メートルです。Float / doubleは15の有効数字を与えます。いくつかの速くて危険な暗算では...丸め/近似誤差は、この塗りつぶしの長さとほぼ同じになります-> "。"


1
画面技術をAppleに売り、何十億ドルも稼ぎましょう!(簡単な計算に
よれ


8

float SQL Serverでは、実際には[編集:ほとんど](C#の意味で)「倍精度」の精度があります。

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

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


2
実際、.NETでのIIRC、doubleは、52ビットの仮数と11ビットの指数を使用します。
richardtallent 2009

私は気の毒になるでしょう。あなたが正しい!SQLが余分なビットで何をするのだろう。指数には使用されません。その場合、指数は+ -308ではなく+ -616になります。多分NULLを追跡する?
ユーロミセリ2009

今私は混乱しています。すべての証拠は、それらが(Windowsの他のすべてと同じ)同じ形式を使用するという考えを示しています。そして、なぜ彼らはそうしませんか?SQL Serverのビット表記(フロートのヘルプページ以外)に関する明確なステートメントが見つかりません。見つけたら訂正を投稿します。
ユーロミセリ2009

5

SQLサーバーの場合:

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

本当の答えはFloatです。10進数については間違っていました。

その理由は、小数を使用する場合、小数型の64ビットを埋めることは決してないためです。

ただし、int型を使用しようとしても、decimalではエラーは発生しません。

これは、タイプの優れた参照チャートです。


今、それは2つの異なる答えでさらに混乱しています:p
Xaisoft

1
混乱しないでください。この答えは間違っています。10進数は10を底とするタイプです。Float(SQL ServerおよびCLRの場合)は、base-2タイプです。
マイケルペロッタ

3

選ぶことができるように聞こえます。floatを選択すると、11桁の精度が失われる可能性があります。それが許容できる場合は、それを実行してください。明らかにLinqの設計者は、これは良いトレードオフであると考えていました。

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


これは緯度と経度の値を格納するためのものです。これは違いがありますか?
Xaisoft 2009

これは間違っています。MSSQLのfloat / float(53)とC#のdoubleはどちらも約15桁の精度です。それらはまったく同じではありませんが、十分に近いです。一方、10進数はdoubleを格納するための完全な過剰であり、SQL Serverでのすべての計算について2をベースに戻し、doubleとしてC#に戻す必要があります。
richardtallent 2009

私は修正された立場です。あなたが言っていることは私には完璧な意味があります。小数は、どこでも小数値として保持する場合にのみ意味があります。ベース10からベース2(およびその逆)に変換するたびに価値が失われます。
DaveN59 2009

-2

A はSQLサーバーをFloat表しdoubleます。Visual StudioのC#のコーディングから証明を見つけることができます。ここでは、SQLサーバーとC#でOvertimeとして宣言しましたFloat。したがって、私は変換することができます

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

ここOverTimeに宣言されていますfloat type

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.