Bir sql sunucusu çift temsil eden nedir?


335

Özellikleri C#olan bir çift var doubleve bunları SQL Server'da bir tabloda saklamak istiyorum, ancak hiçbir doubletürü, yani en iyi kullanmak için ne olduğunu fark ettim , decimalya dafloat ?

Bu enlem ve boylam değerlerini depolayacaktır, bu yüzden en doğru hassasiyete ihtiyacım var.

Şimdiye kadar verdiğiniz yanıtlar için teşekkürler.


SQL Server ile CLR veri türü eşlemeleri şunlardır: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Aşil

Bir yoktur MSDN büyük iplik FLOAT ve DECIMAL arasındaki temel farkı açıklayan. Kısacası, Float yaklaşıktır ve bazı değerleri temsil edemez. Kabul edilen cevaba bakın.
Matthew Jones

Yanıtlar:


387
float

Veya eski okula gitmek istiyorsanız:

real

Şamandıra (53) da kullanabilirsiniz, ancak şamandıra ile aynı anlama gelir.

("gerçek" şamandıra / şamandıra (53) değil şamandıra (24) eşdeğerdir.)

Ondalık (x, y) SQL Server türü istediğiniz zaman içindir kesin ziyade noktası (yaklaşık değerler olabilir) yüzen daha ondalık sayılar. Bu, 128 bit kayan nokta sayısı gibi C # "ondalık" veri türünün aksine.

MSSQL'in float türü .NET'teki 64 bit çift tipine eşdeğerdir . (2011'den aldığım orijinal cevabım mantiste küçük bir fark olabileceğini söyledi, ancak 2020'de test ettim ve hem çok küçük hem de çok büyük sayıların ikili sunumlarında% 100 uyumlu görünüyorlar - bkz. Https: / /dotnetfiddle.net/wLX5Ox için ).

İşleri daha karmaşık hale getirmek için, C # 'daki bir "float" sadece 32-bit'tir, bu yüzden SQL'de float / float (53)' den gerçek / float (24) tipine daha eşdeğer olacaktır.

Özel kullanım durumunda ... İhtiyacınız olan tek şey, yaklaşık bir metre hassasiyet içinde enlem ve boylamı temsil etmek için ondalık noktadan sonra 5 basamaktır ve dereceler için ondalık noktadan önce yalnızca üç basamağa ihtiyacınız vardır. Float (24) veya ondalık (8,5) MSSQL'deki ihtiyaçlarınızı en iyi şekilde karşılar ve C # 'da float kullanmak yeterince iyidir, iki katına ihtiyacınız yoktur. Aslında, kullanıcılarınız muhtemelen sürüş için bir sürü önemsiz basamak almak yerine 5 ondalık basamağa yuvarladığınız için teşekkür edeceklerdir.


1
Şamandıra diyorsun, David ondalık diyor, şimdi daha da kafam karıştı :)
Xaisoft

Ben c # çiftler kullanıyorum ve bu değerler kendi sütunlarında enlem ve boylam değerleri olacaktır.
Xaisoft

1
Aynı fikirdeyim ve itiraf ettiğimi itiraf etmeliyim. Ondalık, IBM platformlarında tüm kod lezzetleri ve veritabanı tarafından desteklenen gerçek bir veri türü olan IBM DB2 dünyasında tanıtıldı. MS dünyasında gerçek bir veri türü olmadığı için değil, IBM kampında olduğu kadar desteklenmiyor. Herhangi bir karışıklık yarattığım için üzgünüm.
DaveN59

2
"MSSQL float, .NET'teki 64-bit çift tipiyle tam olarak aynı hassasiyete sahip değil (mantissa IIRC'de küçük bir fark), ancak çoğu kullanım için yeterince yakın bir eşleşme." Bunun için bir referansınız var mı? Görebildiğim kadarıyla, her ikisi de 53 bit anlamlı, 64 bit depolama için kullanıyor ve IEEE 754 ile aynı bit düzenine ve anlamına sahip.
codekaizen

2
Ayrıca @codekaizen tarafından sorulan soruyu oldukça merak ediyorum (mantiste küçük bir fark). Bunu örnekleyen bir referansınız veya testiniz var mı?
Mads Ravn


15

şamandıra en yakın eşdeğerdir.

SqlDbType Numaralandırma

OP'nin belirttiği gibi Lat / Long için.

Bir metre enlemin 1 / 40.000.000, 1 saniye yaklaşık 30 metredir. Float / double size 15 önemli rakam verir. Bazı hızlı ve tehlikeli zihinsel aritmetik ile ... yuvarlama / yaklaşım hataları bu dolum durağının uzunluğu hakkında olacaktır -> "."


1
Ekran teknolojinizi Apple'a satın ve milyarlar kazanın! (Hızlı aritmetik, Kuzey / Güney Kutbuna yakın enlemlerde bile, şimdiye kadar duyduğum en aşırı çözünürlüğe sahip olduğunuzu söylüyor; benimkinden yaklaşık milyar kat daha fazla.)
Jonas Byström


8

float SQL Server aslında [edit: neredeyse] bir "çift" (C # anlamda) hassasiyetine sahiptir.

floatile eşanlamlıdır float(53). 53 mantisin bitidir.

.NET doublemantis için 54 bit kullanır.


2
Aslında, .NET'te çift olan IIRC, 52 bit mantis ve 11 bit üs kullanır.
richardtallent

Lanetleneceğim; haklısın! SQL ekstra bit ile ne yaptığını merak ediyorum; üs için kullanılmaz. Eğer öyleyse, üs + -308 yerine + -616'ya yükselir. Belki NULL izlemek için?
Euro Micelli

Şimdi kafam karıştı. Her kanıt parçası, aynı biçimi kullandıkları fikrine işaret eder (Windows'taki diğer her şey gibi). Neden olmasın ki? SQL Server (float için yardım sayfasının yanı sıra) bitwise gösterimi üzerinde kesin bir ifade bulamıyorum. Öğrenirsem bir düzeltme gönderirim.
Euro Micelli

5

SQL Sever için:

Ondalık Tip 128 bit imzalı sayı Float 64 bit imzalı bir sayıdır.

Asıl cevap şamandıra , ondalık konusunda yanılmışım.

Bunun nedeni, ondalık basamak kullanırsanız, hiçbir zaman ondalık türün 64 bitini doldurmazsınız.

İnt türünü kullanmaya çalışırsanız ondalık basamak size bir hata vermez.

İşte türlerin güzel bir referans tablosu.


Şimdi iki farklı
cevapla

1
Kafan karışmasın. Bu cevap yanlış. Ondalık bir taban-10 türüdür; Float (SQL Server ve CLR'de) bir base-2 türüdür.
Michael Petrotta

3

Seçip seçebileceğiniz gibi geliyor. Şamandıra seçerseniz, 11 basamak hassasiyet kaybedebilirsiniz. Bu kabul edilebilirse, gidin - görünüşe göre Linq tasarımcıları bunun iyi bir ödünleşme olduğunu düşündüler.

Ancak, uygulamanızda fazladan basamak bulunması gerekiyorsa ondalık basamak kullanın. Ondalık (doğru bir şekilde uygulanmış) zaten bir kayan noktadan çok daha doğrudur - taban 10'dan taban 2'ye ve arkaya dağınık çeviri yoktur.


Bu, enlem ve boylam değerlerini saklamak içindir. Fark eder mi?
Xaisoft

Bu sadece yanlış ... MSSQL'de float / float (53) ve C # 'da double yaklaşık 15 basamak hassasiyete sahiptir. Tam olarak aynı değiller, ama yeterince yakınlar. Öte yandan, ondalık, bir çift depolamak için tamamen aşırıdır ve SQL Server'daki tüm hesaplamalar için taban 2'ye geri dönmeli ve C # 'a çift olarak geri dönmelidir.
richardtallent

Ben düzeltilmiş duruyorum. Söylediklerin benim için çok mantıklı. Ondalık, yalnızca her yerde ondalık değer olarak tutarsanız mantıklıdır. Taban 10'dan taban 2'ye (ve geri) bir dönüşüm yaptığınızda değer kaybedersiniz.
DaveN59

-2

A SQL sunucusunda Floattemsil eder double. Görsel stüdyoda C # kodlamasından bir kanıt bulabilirsiniz. Burada Overtimebir FloatSQL sunucu ve C # olarak ilan ettim . Böylece dönüştürebiliyorum

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

İşte OverTimeilan edildifloat type

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.