복붙노트

[SQL] 왜 C #을 플로트에서 SQL 플로트 다른입니다

SQL

왜 C #을 플로트에서 SQL 플로트 다른입니다

안녕하세요, 저는 DataRow를이 데이터 집합에서 DataTable을 밖으로 뽑아 있습니다. 나는 부동 소수점 데이터 형식으로 SQL에 정의 된 컬럼에 접근하고있다. 나는 로컬 변수에 그 값 (C #을 플로트 데이터 형식)을 할당하려고하지만, InvalidCastExecption을 얻고있다

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

자,이 주변에 연주하는 것은 나는 그것이 작동되도록 않았지만, 그것은 어떤 의미를하지 않았고 그것은 바로 생각하지 않았다.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

아무도 내가 여기에 놓친 거지 어떻게 설명 할 수 있습니까?

해결법

  1. ==============================

    1.는 SQL 플로트는 SQLDbType에 대한 설명서에 이중있어서이다.

    는 SQL 플로트는 SQLDbType에 대한 설명서에 이중있어서이다.

  2. ==============================

    2.SQL의 float는 CLR에 두 번 (C # / VB)입니다. MSDN에서 CLR 등가물과 SQL 데이터 형식의 테이블이있다.

    SQL의 float는 CLR에 두 번 (C # / VB)입니다. MSDN에서 CLR 등가물과 SQL 데이터 형식의 테이블이있다.

  3. ==============================

    3.그리고 일반적으로 당신은 당신이 부정확 한 데이터 형이며, 그것은 계산 오류를 소개합니다 같은 데이터에 수학 계산을 수행하려는 경우 SQL 서버 (또는 실제)에 플로트를 사용하고 싶지는 않을 것입니다. 당신이 정밀도를 필요로 대신하는 경우 소수점 데이터 유형을 사용합니다.

    그리고 일반적으로 당신은 당신이 부정확 한 데이터 형이며, 그것은 계산 오류를 소개합니다 같은 데이터에 수학 계산을 수행하려는 경우 SQL 서버 (또는 실제)에 플로트를 사용하고 싶지는 않을 것입니다. 당신이 정밀도를 필요로 대신하는 경우 소수점 데이터 유형을 사용합니다.

  4. ==============================

    4.마이크로 소프트 SQL 서버의 플로트는 두 번 C에서 #에 해당합니다. 그 이유는 부동 소수점 숫자 만 십진수 숫자는 그 번호가 진수 근사 방법을 정확하게 결정하는 부동 소수점의 정밀도를 근사 할 수 있다는 것이다. 이중 유형 배정도 64 비트 부동 소수점 제외 1.79769313486232e308 긍정적 1.79769313486232e308 범위 값 번호뿐만 아니라 포지티브 또는 네거티브 제로 양의 무한, 음의 무한하고, 비수 (NaN) 등을 나타낸다.

    마이크로 소프트 SQL 서버의 플로트는 두 번 C에서 #에 해당합니다. 그 이유는 부동 소수점 숫자 만 십진수 숫자는 그 번호가 진수 근사 방법을 정확하게 결정하는 부동 소수점의 정밀도를 근사 할 수 있다는 것이다. 이중 유형 배정도 64 비트 부동 소수점 제외 1.79769313486232e308 긍정적 1.79769313486232e308 범위 값 번호뿐만 아니라 포지티브 또는 네거티브 제로 양의 무한, 음의 무한하고, 비수 (NaN) 등을 나타낸다.

  5. ==============================

    5.나는 주요 질문에 대한 답변이되었다고 생각하지만, 나는이 작품을하는 것이 질문의 섹션에 대한 상태를 뭔가를 추가하도록 강요 느낌.

    나는 주요 질문에 대한 답변이되었다고 생각하지만, 나는이 작품을하는 것이 질문의 섹션에 대한 상태를 뭔가를 추가하도록 강요 느낌.

    이유는이 "작품"하고 "잘 느끼지 않는다"이유는 당신이 정밀도를 잃고 효과적으로 그 컴파일러를 말하고있다, 그래서 두 번째 캐스트 (왼쪽에있는 것)에 의해 float로 더블 다운 그레이드이다 반환 된 값을 절단하는 것이 괜찮습니다.

    즉이 줄은 상태 ... (이 경우에 두 번 개최 일어나는) 객체를 가져옵니다 (모든 개체 포장 손실) 이중에 객체를 캐스트 float로의 더블 캐스트 (모든 이중의 미세 정밀도를 잃고)

    예를 들면 값이 말은 경우 0.0124022806089461 당신은 다음 AccelLimit의 값이됩니다 위의 작업을 수행 0.01240228

    이 같은 C #에서 플로트가 이중 값에서 얻을 수있는 정도입니다. 그 위험한 일을 수행하고 내가 확신 자사의 절단도 아닌 반올림하지만 난 잘 모르겠습니다으로 누군가가 이것을 확인 할 수 있습니다.

  6. ==============================

    6.C 번호는 언 박싱과 매우 다른 두 가지있는, 주조 동일한 구문을 사용하기 때문에이 "느낌이 좋지 않습니다"이유입니다. [ "DefaultAccelLimit은"] 대상으로 이중 박스 값을 포함 운동. (더블) 이중으로 객체 다시 언 박싱 필요합니다. 그 앞의 (플로트)를 플로트 값 이중 캐스트. 당신이 다음 캐스트, 언 박싱 있어야하므로 C #은 권투와 같은 작업에 캐스팅을 허용하지 않습니다.

    C 번호는 언 박싱과 매우 다른 두 가지있는, 주조 동일한 구문을 사용하기 때문에이 "느낌이 좋지 않습니다"이유입니다. [ "DefaultAccelLimit은"] 대상으로 이중 박스 값을 포함 운동. (더블) 이중으로 객체 다시 언 박싱 필요합니다. 그 앞의 (플로트)를 플로트 값 이중 캐스트. 당신이 다음 캐스트, 언 박싱 있어야하므로 C #은 권투와 같은 작업에 캐스팅을 허용하지 않습니다.

    같은 캐스트는 비파괴 경우에도 마찬가지입니다. (더블) (플로트) object_var : 부동는 당신이 이중으로 캐스팅하고 싶다고 개체로 상자에 넣어 진 경우, 당신은 그렇게 좋아 할 것입니다.

  7. from https://stackoverflow.com/questions/122523/why-is-a-sql-float-different-from-a-c-sharp-float by cc-by-sa and MIT license