SQL Server에서 이중을 나타내는 것은 무엇입니까?


335

나는 몇 가지 속성을 C#가지고 있으며 doubleSQL Server의 테이블 에이 속성 을 저장하려고하지만 double유형 이 없으므로 사용하기 가장 좋은 방법 decimal또는 float?

위도 및 경도 값이 저장되므로 가장 정확한 정밀도가 필요합니다.

지금까지 답변 해 주셔서 감사합니다.


다음은 SQL Server에 대한 CLR 데이터 형식 매핑입니다. http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles

FLOAT와 DECIMAL의 주요 차이점 을 MSDN에 설명 하는 큰 스레드가 있습니다. 간단히 말해 Float은 근사값이며 일부 값을 나타낼 수 없습니다. 허용 된 답변을보십시오.
Matthew Jones

답변:


387
float

또는 구식 학교를 가고 싶다면 :

real

float (53)을 사용할 수도 있지만 float와 같은 의미입니다.

( "실제"는 float / float (53)가 아니라 float (24)와 같습니다.)

진수 (x, y)는 SQL 서버 유형은 당신이 원하는 때입니다 정확한 오히려 포인트 (근사치가 될 수있는) 부동보다 진수를. 이는 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을 사용하는 것이 충분하므로 이중이 필요하지 않습니다. 실제로, 사용자는 아마 작은 숫자를 타기보다는 소수점 이하 5 자리로 반올림 해 주셔서 감사 할 것입니다.


1
당신은 float라고, David는 십진수라고 말합니다. 이제 저는 더 혼란 스럽습니다 :)
Xaisoft

c #에서 double을 사용하고 있으며 이러한 값은 해당 열의 위도 및 경도 값입니다.
Xaisoft

1
나는 동의해야하고 기지에서 벗어 났음을 인정해야한다. 저는 IBM DB2 세계에서 10 진수를 소개했습니다. 여기서 10 진수는 모든 유형의 코드와 IBM 플랫폼의 데이터베이스에서 지원되는 실제 데이터 유형입니다. MS 세계에서는 실제 데이터 유형이 아니지만 IBM 캠프에서도 지원되지 않습니다. 혼란을 끼쳐 드려 죄송합니다.
DaveN59

2
"MSSQL float은 .NET의 64 비트 double 유형 (mantissa IIRC의 약간의 차이)과 정확히 같은 정밀도를 갖지는 않지만 대부분의 용도와 거의 일치합니다." 이에 대한 참조가 있습니까? 내가 볼 수있는 한, 53 비트의 의미를 사용하고, 저장을 위해 64 비트를 사용하며, IEEE 754와 동일한 비트 레이아웃과 의미를 갖습니다.
codekaizen

2
또한 @codekaizen (mantissa의 약간의 차이)에 의해 제기 된 질문에 대해 매우 궁금합니다. 이것을 예시하는 참조 또는 테스트가 있습니까?
Mads Ravn


15

float는 가장 가까운 값입니다.

SqlDbType 열거

OP가 언급 한 Lat / Long의 경우.

미터는 위도의 1 / 40,000,000이고 1 초는 약 30 미터입니다. float / double은 15 개의 유효 숫자를 제공합니다. 빠르고 피상적 인 정신 산술로 반올림 / 근사 오류는이 채우기 중지의 길이-> "입니다."


1
화면 기술을 Apple에 판매하고 수십억 달러를 벌어보세요! (빠른 산술은 내가 당신이 지금까지 들어 본 극도의 해상, 심지어 북극보다 가까운 위도에서, 내 것보다 약 10 억 배 더 높다는 것을
말해줍니다


8

float SQL Server에서 실제로 "edit : 거의"정밀도는 "double"(C # 의미)입니다.

float의 동의어입니다 float(53). 53은 가수의 비트입니다.

.NET double은 가수에 54 비트를 사용합니다.


2
실제로 .NET에서 두 배의 IIRC는 52 비트 가수와 11 비트 지수를 사용합니다.
richardtallent

나는 과감 할 것이다. 네가 옳아! 여분의 비트로 SQL이 무엇을하는지 궁금합니다. 지수에 사용되지 않습니다. 만약 그렇다면 지수는 + -308 대신 + -616까지 올라갑니다. NULL을 추적 할 수 있습니까?
Euro Micelli

이제 혼란 스러워요. 모든 증거는 동일한 형식을 사용한다는 아이디어를 나타냅니다 (Windows의 다른 모든 항목과 동일). 왜 안 그래? SQL Server의 비트 표현 (float에 대한 도움말 페이지 제외)에서 명확한 문장을 찾을 수 없습니다. 알아 내면 정정 내용을 게시하겠습니다.
Euro Micelli

5

SQL Sever의 경우 :

10 진수 유형은 128 비트 부호있는 숫자입니다. Float는 64 비트 부호있는 숫자입니다.

실제 대답은 Float 입니다. 소수점에 대해서는 틀 렸습니다.

그 이유는 10 진수를 사용하면 64 비트의 10 진수 유형을 채우지 않기 때문입니다.

int 유형을 사용하려고하면 10 진수로 오류가 발생하지 않습니다.

다음 은 유형에 대한 멋진 참조 차트입니다.


이제는 두 가지 다른 답변과 더 혼란 스럽습니다 : p
Xaisoft

1
혼동하지 마십시오. 이 답변은 잘못되었습니다. 10 진수는 10 진법입니다. Float (SQL Server 및 CLR)는 기본 -2 유형입니다.
Michael Petrotta

3

선택하고 선택할 수있는 것 같습니다. float를 선택하면 11 자리의 정밀도가 떨어질 수 있습니다. 그것이 받아 들여 진다면, Linq 디자이너들은 이것이 좋은 트레이드 오프라고 생각한 것 같습니다.

그러나 응용 프로그램에 추가 자릿수가 필요한 경우 십진수를 사용하십시오. 십진법 (정확하게 구현 됨)은 어쨌든 부동 소수점보다 훨씬 정확합니다. 10 진법에서 2 진법으로의 변환은 뒤지지 않습니다.


위도 및 경도 값을 저장하기위한 것입니다. 차이가 있습니까?
Xaisoft

이것은 잘못되었습니다 ... MSSQL의 float / float (53)와 C #의 double은 모두 약 15 자리의 정밀도를 갖습니다. 그것들은 정확히 같지는 않지만 충분히 가깝습니다. 반면에 Decimal은 double을 저장하는 데있어 과도한 오버 킬이며 SQL Server의 모든 계산을 위해 base 2로 돌아가서 C #으로 double로 돌아와야합니다.
richardtallent

나는 정정되었다. 당신이 말하는 것은 나에게 완벽합니다. 십진수는 어디에서나 십진수 값으로 유지하는 경우에만 의미가 있습니다. 10 진법에서 2 진법으로 (그리고 그 뒤로) 변환 할 때마다 가치를 잃습니다.
DaveN59

-2

A FloatdoubleSQL 서버에서 나타냅니다 . 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.