Điều gì đại diện cho một đôi trong máy chủ sql?


335

Tôi có một vài thuộc tính trong C#đó doublevà tôi muốn lưu trữ chúng trong một bảng trong SQL Server, nhưng nhận thấy không có doubleloại nào , vậy nên sử dụng cái gì là tốt nhất, decimalhay float?

Điều này sẽ lưu trữ các giá trị vĩ độ và kinh độ, vì vậy tôi cần độ chính xác chính xác nhất.

Cám ơn các câu trả lời cho đến nay.


Dưới đây là ánh xạ kiểu dữ liệu CLR tới SQL Server: http://msdn.microsoft.com/en-us/l
Library / system.data.sqldbtype.aspx

Có một chủ đề tuyệt vời trên MSDN mô tả sự khác biệt chính giữa FLOAT và DECIMAL. Nói tóm lại, Float là gần đúng và không thể đại diện cho một số giá trị. Nhìn vào câu trả lời được chấp nhận.
Matthew Jones

Câu trả lời:


387
float

Hoặc nếu bạn muốn đi học cũ:

real

Bạn cũng có thể sử dụng float (53), nhưng nó có nghĩa tương tự như float.

("thực" tương đương với float (24), không phải float / float (53).)

Các chữ số thập phân (x, y) kiểu SQL Server là khi bạn muốn chính xác số thập phân chứ không phải là điểm (có thể xấp xỉ) nổi. Điều này trái ngược với kiểu dữ liệu "thập phân" C #, giống như số dấu phẩy động 128 bit.

Kiểu float của MSSQL tương đương với kiểu double 64 bit trong .NET. (Câu trả lời ban đầu của tôi từ năm 2011 cho biết có thể có một chút khác biệt về mantissa, nhưng tôi đã thử nghiệm điều này vào năm 2020 và chúng dường như tương thích 100% trong biểu diễn nhị phân của cả hai số rất nhỏ và rất lớn - xem https: / /dotnetfiddle.net/wLX5Ox cho bài kiểm tra của tôi).

Để làm cho mọi thứ trở nên khó hiểu hơn, một "float" trong C # chỉ là 32 bit, do đó, nó sẽ tương đương với SQL với kiểu thực / float (24) trong MSSQL hơn là float / float (53).

Trong trường hợp sử dụng cụ thể của bạn ... Tất cả những gì bạn cần là 5 vị trí sau dấu thập phân để biểu thị vĩ độ và kinh độ trong độ chính xác khoảng một mét và bạn chỉ cần tối đa ba chữ số trước dấu thập phân cho độ. Float (24) hoặc thập phân (8,5) sẽ phù hợp nhất với nhu cầu của bạn trong MSSQL và sử dụng float trong C # là đủ tốt, bạn không cần gấp đôi. Trên thực tế, người dùng của bạn có thể sẽ cảm ơn bạn vì đã làm tròn đến 5 chữ số thập phân thay vì có một loạt các chữ số không đáng kể xuất hiện trong chuyến đi.


1
Bạn nói nổi, David nói thập phân, bây giờ tôi còn bối rối hơn nữa :)
Xaisoft

Tôi đang sử dụng gấp đôi trong c # và các giá trị này sẽ là giá trị vĩ độ và kinh độ trong các cột tương ứng.
Xaisoft

1
Tôi phải đồng tình, và thừa nhận tôi đã rời khỏi căn cứ. Tôi đã được giới thiệu về thập phân trong thế giới IBM IBM, trong đó thập phân là một loại dữ liệu thực, được hỗ trợ bởi tất cả các loại mã và cơ sở dữ liệu trên các nền tảng của IBM. Không phải nó không phải là một kiểu dữ liệu thực sự trong thế giới MS, nhưng nó không được hỗ trợ cũng như trong trại của IBM. Xin lỗi vì đã tạo ra bất kỳ sự nhầm lẫn.
DaveN59

2
"Phao MSSQL không có độ chính xác chính xác như loại kép 64 bit trong .NET (khác biệt đôi chút về mantissa IIRC), nhưng nó phù hợp với hầu hết các ứng dụng." Bạn có một tài liệu tham khảo cho điều này? Theo như tôi có thể thấy, cả hai đều sử dụng 53 bit có ý nghĩa, sử dụng 64 bit để lưu trữ và có cùng bố cục bit và ý nghĩa như IEEE 754.
codekaizen

2
Tôi cũng khá tò mò về câu hỏi được đặt ra bởi @codekaizen (một chút khác biệt về mantissa). Bạn có một tài liệu tham khảo hoặc một bài kiểm tra nào minh họa điều này?
Mads Ravn


15

float là tương đương gần nhất.

Bảng liệt kê SqlDbType

Đối với Lat / Long như OP đã đề cập.

Một mét là 1 / 40.000.000 vĩ độ, 1 giây là khoảng 30 mét. Float / double cung cấp cho bạn 15 con số đáng kể. Với một số số học tinh thần nhanh chóng và tinh ranh ... các lỗi làm tròn / xấp xỉ sẽ là khoảng thời gian dừng lấp đầy này -> "."


1
Bán công nghệ màn hình của bạn cho Apple và kiếm tiền tỷ! (Quick số học nói với tôi bạn có độ phân giải cực đoan nhất mà tôi từng nghe nói, ngay cả ở các vĩ độ gần với Bắc / Nam Cực; cao hơn khoảng một tỉ lần so với tôi.)
Jonas Byström


8

float trong SQL Server thực sự có [chỉnh sửa: gần như] độ chính xác của "nhân đôi" (theo nghĩa C #).

floatlà một từ đồng nghĩa với float(53). 53 là các bit của lớp phủ.

.NET doublesử dụng 54 bit cho lớp phủ.


2
Trên thực tế, IIRC, double in .NET sử dụng mantissa 52 bit và số mũ 11 bit.
richardtallent

Tôi sẽ chết lặng; bạn đúng! Tôi tự hỏi SQL làm gì với bit thừa; nó không được sử dụng cho số mũ. Nếu có, số mũ sẽ tăng lên + -616 thay vì + -308. Có lẽ để theo dõi NULL?
Euro Micelli

Bây giờ tôi đang bối rối. Mỗi phần bằng chứng chỉ ra ý tưởng rằng chúng sử dụng cùng định dạng (như mọi thứ khác trong Windows). Và tại sao họ lại không? Tôi không thể tìm thấy một tuyên bố xác định về biểu diễn bitwise trong SQL Server (bên cạnh trang trợ giúp cho float). Tôi sẽ đăng một sự điều chỉnh nếu tôi tìm ra.
Euro Micelli

5

Đối với SQL Sever:

Kiểu thập phân là số có chữ ký 128 bit Float là số có chữ ký 64 bit.

Câu trả lời thực sự là Float , tôi đã không chính xác về số thập phân.

Lý do là nếu bạn sử dụng số thập phân, bạn sẽ không bao giờ điền 64 bit của loại thập phân.

Mặc dù số thập phân sẽ không gây ra lỗi nếu bạn cố sử dụng kiểu int.

Dưới đây là một biểu đồ tham khảo tốt đẹp của các loại.


Bây giờ thậm chí còn khó hiểu hơn với hai câu trả lời khác nhau: p
Xaisoft

1
Đừng nhầm lẫn. Câu trả lời này là sai. Số thập phân là loại cơ sở 10; Float (trong SQL Server và CLR) là loại cơ sở 2.
Michael Petrotta

3

Có vẻ như bạn có thể chọn và chọn. Nếu bạn chọn float, bạn có thể mất 11 chữ số chính xác. Nếu điều đó được chấp nhận, hãy chấp nhận - rõ ràng các nhà thiết kế Linq nghĩ rằng đây là một sự đánh đổi tốt.

Tuy nhiên, nếu ứng dụng của bạn cần những chữ số phụ đó, hãy sử dụng số thập phân. Số thập phân (được triển khai chính xác) là cách chính xác hơn so với số float - không có bản dịch lộn xộn từ cơ sở 10 sang cơ sở 2 và ngược lại.


Điều này là để lưu trữ các giá trị vĩ độ và kinh độ. Điều này làm cho một sự khác biệt?
Xaisoft

Điều này chỉ sai ... cả float / float (53) trong MSSQL và double trong C # đều có độ chính xác xấp xỉ 15 chữ số. Chúng không giống hệt nhau, nhưng đủ gần. Mặt khác, Decimal hoàn toàn quá mức cần thiết để lưu trữ gấp đôi và nó phải quay trở lại cơ sở 2 cho tất cả các tính toán trong SQL Server và quay lại C # dưới dạng gấp đôi.
richardtallent

Tôi đứng sửa. Những gì bạn đang nói có ý nghĩa hoàn hảo với tôi. Số thập phân chỉ có ý nghĩa nếu bạn giữ nó dưới dạng giá trị thập phân ở mọi nơi. Bạn mất giá trị bất cứ khi nào bạn thực hiện chuyển đổi từ cơ sở 10 sang cơ sở 2 (và trở lại).
DaveN59

-2

Một Floatđại diện doubletrong máy chủ SQL. Bạn có thể tìm thấy một bằng chứng từ mã hóa trong C # trong studio hình ảnh. Ở đây tôi đã khai báo Overtimelà một Floatmáy chủ SQL và trong C #. Do đó tôi có thể chuyển đổi

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

Đây OverTimelà tuyên bốfloat type

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.