2009-08-17 1 views
2

내가 코드는 다음과 같습니다 제네릭 형식의 T.에 (내가 데이터베이스에서 얻을 수있는) Object에서 변환 할 Convert.ChangeType()를 사용하고 있습니다 :C#을 잘못 변환

T element = (T)Convert.ChangeType(obj, typeof(T)); 
return element; 

이것은 대부분의 시간, 그러나 나는 다음과 같은 SQL 쿼리

select 3.2 

위의 코드 (T 이중 인)의 복귀로 간단하게 뭔가를 캐스팅하려고하면 늘 3.2을 반환 것을 발견 잘 작동하지만, 3.2000000000000002 . 왜 이런 일이 일어나고 있는지, 어떻게 고쳐야하는지 알 수 없습니다. 도와주세요!

답변

7

여러분이보고있는 것은 부동 소수점 숫자가 메모리에 표현되는 방식의 인공물입니다. 정확히 왜 이런 정보가 있는지 꽤 많은 정보가 있지만, this paper은 좋은 정보입니다. 이 현상은 당신이 겉으로보기에는 예외적 인 행동으로 끝날 수있는 이유입니다. double 또는 single은 사용자에게 형식이 지정되지 않아야하며, 전염병과 같은 동등 비교는 피해야합니다.

정확도가 더 높은 (즉, 통화 값을 나타내는) 숫자가 필요한 경우 decimal을 사용하십시오.

2

변환의 문제는 아닙니다. 내부 double 형은 실수의 2의 무한대로 표현됩니다. 그래서 그 결과를 얻었습니다. 목적 사용의 따라 :

  • 어느 진수
  • 또는 정확한 형식화하는 사용 {0 : F2}을
  • 사용 Math.Flor/Math.Ceil