문제

Howdy, 나는 데이터 세트에서 데이터 가능에서 데이터를 뽑아 냈습니다. SQL에서 플로트 데이터 유형으로 정의 된 열에 액세스하고 있습니다. 해당 값이 로컬 변수 (C# float 데이터 유형)에 할당하려고하지만 InvalidcastExecption을 받고 있습니다.

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

이제, 이것을 가지고 놀면서 나는 그것을 작동 시켰지만 그것은 말이되지 않았고 옳지 않은 느낌이 들지 않았습니다.

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

누구든지 내가 여기서 놓친 것을 설명 할 수 있습니까?

도움이 되었습니까?

해결책

SQL 플로트는에 따라 두 배입니다 sqldbtype에 대한 문서.

다른 팁

SQL의 플로트는 a입니다 더블 CLR (C#/VB)에서. 거기 있습니다 CLR 등가물이있는 SQL 데이터 유형 테이블 MSDN에서.

그리고 일반적으로 데이터에 대한 수학 계산을 수행 할 계획이없고 계산 오류를 도입 할 경우 데이터에 대한 수학 계산을 수행하려는 경우 SQL Server (또는 Real)에서 Float를 사용하고 싶지 않습니다. 정밀도가 필요한 경우 10 진수 데이터 유형을 사용하십시오.

Microsoft SQL Server의 플로트는 C#의 두 배와 같습니다. 그 이유는 부동 소수점 번호가 소수점 만 근사 할 수 있기 때문입니다. 정도 부동 소수점 번호의 경우 해당 숫자가 얼마나 정확한지를 결정합니다 대략 십진수. 이중 유형은 음의 1.7969313486232E308에서 양수 1.797693134862322E308에 이르기까지 값의 값을 갖는 이중-프레임 64 비트 플로팅 포인트 숫자를 나타냅니다.

나는 주요 질문이 여기에 응답되었다고 생각하지만 이것이 효과가 있다는 질문의 섹션에 무언가를 추가해야한다고 생각합니다.

_accellimit = (float) (Double) 연습 [ "DefaultAccellimit"];

이 "작동"과 "옳지 않은"이유는 두 번째 캐스트 (왼쪽에있는 것)에 의해 두 배를 플로트로 다운 그레이드하고 있기 때문에 정밀도를 잃고 컴파일러에 효과적으로 알려주고 있기 때문입니다. 반환 된 값을 자르지 않아도됩니다.

말로이 라인 상태는 ... 객체를 얻으십시오 (이 경우이 경우 더블을 유지하는) 객체를 두 배로 돌리십시오 (모든 물체 래핑을 잃어버린) 더블)

예 : 값이 0.0124022806089461이면 위의 작업을 수행하면 AccellImit의 값은 0.01240228입니다.

C#의 플로트가 이중 값에서 얻을 수있는 정도입니다. 그것은 위험한 일이며 나는 반올림보다는 잘라낸 것이 아니라 확실하지 않기 때문에 이것을 확인하고 싶을 수도 있습니다.

"옳지 않은"이유는 C#이 동일한 구문을 사용하기 때문입니다. Unboxing 그리고 주조, 이것은 매우 다른 두 가지입니다. exercise["DefaultAccelLimit"] 이중 값이 포함되어 있으며 상자로 객체로 표시됩니다. (double) 필요합니다 Unbox 물체는 다시 두 배로 돌아옵니다. 그만큼 (float) 그 앞에 캐스트 플로트 값에서 이중으로. C#은 동일한 작업에서 권투 및 캐스팅을 허용하지 않으므로 상자를 unper 다음 캐스트해야합니다.

캐스트가 비파괴적인 경우에도 마찬가지입니다. 플로트가 두 배로 캐스팅하려는 객체로 박스를 뿌린 경우 : 당신은 그렇게 할 것입니다. (double)(float)object_var.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top