หมายถึงสองในเซิร์ฟเวอร์ sql คืออะไร?


335

ฉันมีสองคุณสมบัติในC#ซึ่งเป็นdoubleและฉันต้องการที่จะเก็บเหล่านี้ในตารางใน SQL Server แต่สังเกตเห็นไม่มีdoubleประเภทดังนั้นสิ่งที่ดีที่สุดคือการใช้งานdecimalหรือfloat?

วิธีนี้จะเก็บค่าละติจูดและลองจิจูดดังนั้นฉันต้องการความแม่นยำที่แม่นยำที่สุด

ขอบคุณสำหรับคำตอบ


นี่คือการแม็พประเภทข้อมูล CLR ไปยัง SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles

มีเธรดที่ดีใน MSDN ที่อธิบายถึงความแตกต่างหลักระหว่าง FLOAT และ DECIMAL ในระยะสั้นลอยอยู่ประมาณและไม่สามารถเป็นตัวแทนของค่าบางอย่าง ดูคำตอบที่ยอมรับ
Matthew Jones

คำตอบ:


387
float

หรือถ้าคุณต้องการไปโรงเรียนเก่า:

real

คุณยังสามารถใช้โฟลต (53) แต่มันหมายถึงสิ่งเดียวกันกับโฟลต

("ของจริง" เทียบเท่ากับ float (24) ไม่ใช่ float / float (53))

ทศนิยม (x, y)ประเภท SQL Server สำหรับเมื่อคุณต้องการที่แน่นอนตัวเลขทศนิยมมากกว่าจุดลอย (ซึ่งอาจเป็นเพียงการประมาณ) ตรงกันข้ามกับชนิดข้อมูล "ทศนิยม" C # ซึ่งเหมือนกับเลขทศนิยม 128 บิต

MSSQL ของลอยชนิดเทียบเท่ากับ 64 บิตคู่พิมพ์ .NET (คำตอบเดิมของฉันจาก 2011 กล่าวว่าอาจมีความแตกต่างเล็กน้อยใน mantissa แต่ฉันได้ทดสอบในปี 2020 และพวกเขาดูเหมือนจะเข้ากันได้ 100% ในการแสดงเลขฐานสองของพวกเขาทั้งขนาดเล็กและใหญ่มาก - ดูhttps: / /dotnetfiddle.net/wLX5Oxสำหรับการทดสอบของฉัน)

เพื่อทำให้สิ่งต่าง ๆ สับสนมากขึ้น "float" ใน C # มีเพียง 32 บิตดังนั้นมันจะเทียบเท่ากับ SQL ในประเภท real / float (24) ใน MSSQL มากกว่า float / float (53)

ในกรณีการใช้งานเฉพาะของคุณ ... ทั้งหมดที่คุณต้องการคือ 5 ตำแหน่งหลังจากจุดทศนิยมเพื่อเป็นตัวแทนละติจูดและลองจิจูดภายในความแม่นยำประมาณหนึ่งเมตรและคุณต้องการเพียงตัวเลขสามหลักก่อนจุดทศนิยมสำหรับองศา โฟลต (24) หรือทศนิยม (8,5) จะเหมาะกับความต้องการของคุณมากที่สุดใน MSSQL และการใช้โฟลตใน C # นั้นดีพอคุณไม่ต้องการสองเท่า ในความเป็นจริงผู้ใช้ของคุณอาจจะขอบคุณสำหรับการปัดเศษทศนิยม 5 ตำแหน่งแทนการมีตัวเลขที่ไม่มีนัยสำคัญมาร่วมในการเดินทาง


1
คุณบอกว่าลอยเดวิดกล่าวว่าทศนิยมตอนนี้ฉันกำลังสับสนมากยิ่งขึ้น :)
Xaisoft

ฉันใช้คู่ใน c # และค่าเหล่านี้จะเป็นค่าละติจูดและลองจิจูดในคอลัมน์ที่เกี่ยวข้อง
Xaisoft

1
ฉันต้องเห็นด้วยและยอมรับว่าฉันไม่ได้อยู่ที่ฐาน ฉันได้รับการแนะนำให้รู้จักกับทศนิยมในโลก IBM DB2 โดยที่ทศนิยมเป็นชนิดข้อมูลจริงได้รับการสนับสนุนโดยทุกโค้ดและฐานข้อมูลบนแพลตฟอร์ม IBM ไม่ใช่ว่ามันไม่ใช่ประเภทข้อมูลจริงใน MS world แต่ไม่ได้รับการสนับสนุนเช่นเดียวกับในค่าย IBM ขออภัยที่สร้างความสับสน
DaveN59

2
"MSSQL float ไม่มีความแม่นยำเหมือนกันกับ 64-bit double type ใน. NET (ความแตกต่างเล็กน้อยใน mantissa IIRC) แต่มันใกล้เคียงกันมากพอที่ใช้กันมากที่สุด" คุณมีการอ้างอิงสำหรับสิ่งนี้หรือไม่? เท่าที่ฉันเห็นทั้งสองใช้ 53 บิตของ
ซิกนิฟิแคน

2
ฉันยังค่อนข้างอยากรู้อยากเห็นเกี่ยวกับคำถามที่ @codekaizen ยกมา (ต่างกันเล็กน้อยในแมนทิสซา) คุณมีการอ้างอิงหรือการทดสอบที่เป็นตัวอย่างนี้หรือไม่?
Mads Ravn

62

นอกจากนี้ที่นี่คือคำตอบที่ดีสำหรับ SQL-CLR ประเภทการทำแผนที่ด้วยแผนภูมิที่มีประโยชน์

จากโพสต์นั้น (โดยDavid ): ป้อนคำอธิบายรูปภาพที่นี่


ลิงค์ด้านล่างนี้ยังมีการใช้งาน; มันมีข้อมูลเพิ่มเติมดังกล่าวข้างต้นในขณะที่มันแสดงให้เห็นถึงขั้นตอนการ SqlDataReader และ enumerations (นอกเหนือไปจากการเปรียบเทียบประเภท NET และ SQL) docs.microsoft.com/en-us/dotnet/framework/data/adonet/...
d219

15

ลอยเป็นเทียบเท่าที่ใกล้เคียงที่สุด

การนับ SqlDbType

สำหรับ Lat / Long ดังที่ OP ได้กล่าวไว้

ละติจูด 1 / 40,000,000 ของละติจูด 1 วินาทีประมาณ 30 เมตร โฟลต / ดับเบิลให้ 15 ตัวเลขนัยสำคัญ ด้วยเลขคณิตจิตที่รวดเร็วและหลบหลีก ... ข้อผิดพลาดในการปัดเศษ / การประมาณจะเป็นความยาวของจุดหยุดเติม -> ""


1
ขายเทคโนโลยีหน้าจอของคุณให้กับ Apple และทำเงินเป็นพันล้าน! (การคำนวณทางคณิตศาสตร์อย่างรวดเร็วบอกฉันว่าคุณมีความละเอียดสูงสุดเท่าที่ฉันเคยได้ยินมาแม้ในละติจูดที่อยู่ใกล้กับขั้วโลกเหนือ / ขั้วโลกใต้สูงกว่าของฉันประมาณหนึ่งพันล้านเท่า)
Jonas Byström


8

float ใน SQL Server นั้นมี [edit: เกือบ] ความแม่นยำของ "double" (ในความหมาย C #)

floatfloat(53)เป็นคำพ้องสำหรับ 53 คือบิตของแมนทิสซา

.NET doubleใช้ 54 บิตสำหรับแมนทิสซา


2
ที่จริงแล้ว IIRC นั้นเป็นสองเท่าใน. NET ใช้ mantissa 52 บิตและเลขชี้กำลัง 11 บิต
richardtallent

ฉันจะยี้; คุณถูก! ฉันสงสัยว่า SQL ทำอะไรกับบิตพิเศษ; มันไม่ได้ใช้สำหรับเลขชี้กำลัง หากเป็นเช่นนั้นเลขชี้กำลังจะเพิ่มขึ้นเป็น + -616 แทนที่จะเป็น + -308 อาจติดตาม NULL หรือไม่
Euro Micelli

ตอนนี้ฉันสับสน หลักฐานทุกชิ้นชี้ไปที่แนวคิดที่ว่าพวกเขาใช้รูปแบบเดียวกัน (เหมือนทุกอย่างใน Windows) และทำไมพวกเขาจะไม่? ฉันไม่พบคำสั่งที่ชัดเจนเกี่ยวกับการแสดง bitwise ใน SQL Server (นอกเหนือจากหน้าช่วยเหลือสำหรับการลอย) ฉันจะโพสต์การแก้ไขถ้าฉันพบ
Euro Micelli

5

สำหรับ SQL Sever:

Decimal Type คือหมายเลขที่เซ็นชื่อ 128 บิต Float คือหมายเลขที่เซ็นชื่อแบบ 64 บิต

คำตอบที่แท้จริงคือโฟลทฉันไม่ถูกต้องเกี่ยวกับทศนิยม

เหตุผลคือถ้าคุณใช้ทศนิยมคุณจะไม่เติมทศนิยม 64 บิต

แม้ว่าทศนิยมจะไม่ให้ข้อผิดพลาดถ้าคุณพยายามใช้ int ชนิด

นี่คือแผนภูมิอ้างอิงที่ดีของประเภทต่างๆ


ตอนนี้มันยิ่งทำให้สับสนมากขึ้นด้วยคำตอบที่ต่างกันสองข้อ: p
Xaisoft

1
อย่าสับสน คำตอบนี้ผิด ทศนิยมเป็นประเภทฐาน 10 โฟลต (ใน SQL Server และ CLR) เป็นประเภทฐาน 2
Michael Petrotta

3

ดูเหมือนว่าคุณสามารถเลือกและเลือก หากคุณเลือกโฟลตคุณอาจสูญเสียความแม่นยำ 11 หลัก ถ้าเป็นที่ยอมรับก็ไปได้ - เห็นได้ชัดว่านักออกแบบ Linq คิดว่านี่เป็นการแลกเปลี่ยนที่ดี

อย่างไรก็ตามหากแอปพลิเคชันของคุณต้องการตัวเลขพิเศษเหล่านั้นให้ใช้ทศนิยม ทศนิยม (นำไปใช้อย่างถูกต้อง) นั้นแม่นยำกว่าทางลอยอยู่ดี - ไม่มีการแปลที่ยุ่งเหยิงจากฐาน 10 เป็นฐาน 2 และด้านหลัง


ใช้สำหรับจัดเก็บค่าละติจูดและลองจิจูด สิ่งนี้สร้างความแตกต่างหรือไม่?
Xaisoft

นี่เป็นสิ่งที่ผิด ... ทั้ง float / float (53) ใน MSSQL และ double ใน C # มีความแม่นยำประมาณ 15 หลัก พวกเขาไม่เหมือนกัน แต่ใกล้พอ ทศนิยมในทางกลับกันเป็น overkill สมบูรณ์สำหรับการจัดเก็บสองครั้งและจะต้องกลับไปที่ฐาน 2 สำหรับการคำนวณทั้งหมดใน SQL Server และกลับมาที่ C # เป็นสองเท่า
richardtallent

ฉันยืนแก้ไขแล้ว สิ่งที่คุณพูดนั้นเหมาะสมกับฉันมาก ทศนิยมจะเหมาะสมถ้าคุณเก็บไว้เป็นค่าทศนิยมทุกที่ คุณสูญเสียคุณค่าเมื่อใดก็ตามที่คุณทำการแปลงจากฐาน 10 เป็นฐาน 2 (และย้อนกลับ)
DaveN59

-2

A Floatแสดงdoubleในเซิร์ฟเวอร์ SQL คุณสามารถหาหลักฐานจากการเข้ารหัสใน C # ใน visual studio ที่นี่ฉันได้ประกาศOvertimeว่าเป็นFloatในเซิร์ฟเวอร์ SQL และใน C # ดังนั้นฉันสามารถแปลง

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

นี่OverTimeคือประกาศfloat type

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.