2011-12-08 2 views
5

Prob 뭔가가 내려다 보이지만이 문제는 나를 크게 괴롭혔습니다. 메신저가 데이터 집합에서 값을 가져 와서 일부 계산을 수행하는 데 사용하려고합니다. 데이터 세트의 을 객체로 간주하므로 int 또는 double로 형변환해야합니다. 어째서 나는 내 신경을 쓰고있는 바보 같은 오류를 받고있다. 코드를 heres.C# 캐스팅 오류 (무엇입니까?)

private void SpendsAnalysis() 
    { 
     float tempQty = 0; 
     float tempPrice = 0; 
     double tempTot = 0; 
     double total = 0; 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      tempQty = (float)row.Cells["Qty"].Value; 
      tempPrice = (float)row.Cells["Unit"].Value; 

      tempTot = tempQty * tempPrice; 
      total += tempTot; 
     } 

     textBox7.Text = total.ToString(); 
    } 

Throw : "지정된 캐스트가 유효하지 않습니다." (System.InvalidCastException) 숫자를 캐스팅 할 때 inifnite보다 작아야합니다. 이것은 점점 성가신 오류입니다. 이제 저장 프로 시저에서 데이터를 가져 오는 데이터 집합에서 데이터를 가져옵니다. "Qty"필드 유형이 통화라고 생각합니다 (예, 왜 qty currency haha입니까, 내 테이블이 아닙니다!). 내 DataGrid보기에서 1.000처럼 보이는데, 이것은 유형 변환으로 인한 것입니까? 내가 어떻게 이걸 교정 할까? 미리 감사드립니다.

+4

는'float' 확실히 currency' 또는 '소수'보다 더 나쁜 일치 '. 하지만 정수형이어야한다고 생각합니다. 통화 계산에서 발생하는'float' /'double'은 큰 붉은 깃발입니다. – CodesInChaos

+0

이 동의하지만 이들은 원래 테이블에 의해 설정된 값입니다. 내가 작동 할 수있는 값으로 캐스팅했습니다. ither double 또는 float – lemunk

+0

왜 'Decimal'이 아닌가요? C#에서는 10 진수를 사용할 수 있습니다. 여기서는 'float'또는 'double'보다 확실히 좋은 선택입니다. – CodesInChaos

답변

9

유형 캐스트가 성공해야하고, 불행하게도, 기본 객체가 아닌 다른 유형으로 object에서 직접 주조는 floatdecimal (currency에 대한 .NET 유형)에서 주조 경우에도 작동하지 않을 정상적으로 작동합니다. 당신이 this를 사용할 수

= (float)(decimal)row.Cells["Qty"].Value; 

또는 : 데이터베이스의 유형 currency 경우

, 나는 이것을 시도 할 것이다 실제 값과 그림에서 살펴볼 것이다

= Convert.ToSingle(row.Cells["Qty"].Value); 

수행 할 올바른 유형의 변환.

귀하의 코멘트에 대답하려면, 위의 표현은 두 가지 변환을 포함한다 :

  • decimal
  • 이 경우에 값 형에 object로부터의 언 박싱 변환, decimal에서 float에 명시 적 변환

첫 번째 언 박싱 변환은 C# 언어 사양 섹션 4.3.2에 설명되어 있습니다 (이 내용은 C# 4.0 specification입니다.)

비 - 널 값 형 된 An 개봉기 동작은 객체 인스턴스가 특정 비 - 널 값 형의 박스 값이라고 확인 첫째로 구성하고 그 값을 복사 인스턴스 밖으로.

(내 강조)

는 또한 사양의 주석 버전과 에릭 Lippert의이 같은 요약

로 언 박싱 INT 변환하는 법이지만 boxed int를 unboxed double 형으로 unboxed 형으로 변환하는 것은 합법적이지 않다.

6.2.1 명시 적 숫자 변환이
명시 적 숫자 변환에의 변환은 다음과 같습니다

두 번째, 명시 적 변환은 C#을 언어 사양 섹션 6.2.1에 설명되어 있습니다 숫자 형식을 암시 적 숫자 변환 (6.1.2)이 아직 존재하지 않는 다른 숫자 형식으로 변환하는 경우
...
부터을 sbyte로 변환하면 byt e, short, ushort, int, uint, long, ulong, char, float 또는 이중.

이 (다시, 내 강조)

이 요약 :

값 형에 object에서 "캐스팅"당신이 실제로 박스 값을 개봉기하고
  • 하고, 먼저 다른 유형으로 변환하기 전에 실제 기본 값을 올바른 유형으로 unbox해야합니다.
+0

hmmmmm 흥미로운 – lemunk

+0

아아 많은 감사합니다 convert.tosingle은 치료를 처리합니다. 사실 그것은 개체가 변환 할 수 없다는 것을 의미합니까? 이것에 대한 정보가 더 있습니까? – lemunk

+3

나는 내 대답에서 말하고 싶은 모든 것을 말했고, 당신은 * 소수점 이하가 아닌 "부동 소수점"으로 당신이 원하는지 확신 할 수 있는가? –