2012-04-17 7 views
2

here과 비슷한 질문이 있습니다. 때로는 숫자가 커질 수 있기 때문에 해당 솔루션에서 예외가 발생합니다.십진수가 바이트를보고 소수점 자리를 포함하는지 확인하십시오.

10 진수의 바이트를 보는 방법이 있다면 더 효율적이라고 생각합니다. 예를 들어 10 진수는 n 바이트 수로 표현되어야합니다. 예를 들어, Int32는 32 비트로 표현되고 비트 1로 시작하는 모든 숫자는 음수입니다. 어쩌면 십진수와 비슷한 종류의 관계가있을 수 있습니다. 십진수의 바이트를 어떻게 볼 수 있습니까? 또는 정수의 바이트?

+3

함께했다 그래서 당신은 비트를보고 싶을 것입니다 ... –

+1

효율성을 찾고 있다면,'decimal'은 아마 해결책의 일부가 아닙니다. – harold

+0

그래, 미안하다. –

답변

9

, 다음 Decimal.GetBits는 소수의 개별 비트를 살펴 보자됩니다. MSDN 페이지에는 비트의 의미에 대한 설명도 들어 있습니다. 한편

, 당신은 단지 숫자가 간단한

var hasFractionalPart = (myValue - Math.Round(myValue) != 0) 

을하고, 분수 부분이 있는지 여부를 확인하려면 바이너리 구조를 디코딩보다는 훨씬 쉽다. 이것은 float 또는 double과 같은 고전적인 부동 소수점 데이터 유형뿐만 아니라 십진수에서도 작동해야합니다. 후자의 경우 부동 소수점 반올림 오류로 인해 0 대신에 Math.Abs(myValue - Math.Round(myValue)) < someThreshold을 확인하는 것이 좋습니다.

+5

'myValue - Math.Truncate (myValue)'가 약간 더 효율적일 수있다. – phoog

2

십진수 구조에서 비트를 검색하려면 Decimal.GetBits을 사용할 수 있습니다.

들이 메모리에 배치하는 방법 자세한 내용은 위의 링크 된 MSDN 페이지 :

십진수의 이진 표현은 1 비트 기호로 구성

, 96 비트 정수 번호, 스케일링 팩터 정수를 나눈 값과 소수 부분을 지정하는 데 사용됩니다. 배율 인수는 암시 적으로 숫자 10이며 0에서 28까지의 지수로 증가합니다.

반환 값은 32 비트 부호있는 정수의 네 요소로 구성된 배열입니다.

반환되는 배열의 첫 번째, 두 번째 및 세 번째 요소에는 96 비트 정수의 하위, 중간 및 상위 32 비트가 포함됩니다.

반환되는 배열의 네 번째 요소에는 배율 인수와 부호가 들어 있습니다. 다음 파트로 구성됩니다.

비트 0-15는 사용되지 않으므로 0이어야합니다.

비트 16 ~ 23에는 0 ~ 28 사이의 지수가 있어야합니다.이 지수는 정수를 나눌 10의 지수를 나타냅니다.

비트 24-30은 사용되지 않으므로 0이어야합니다.

비트 31에는 부호가 들어 있습니다. 0은 양수를 의미하고 1은 음수를 의미합니다. (부동 소수점 숫자 반대) 당신이 정말로에 대한 진수 번호를 이야기하는 경우

3

decimal 유형의 '십진'값을 얻는 데 비교적 효율적인 방법을 원한다면 하나씩 조정할 수 있습니다.는 이론적으로 최적의 솔루션을하지 않을 수 있지만

decimal number = 4.75M; 
decimal fractionalPart = number % 1; 
Console.WriteLine(fractionalPart); //will print 0.75 

, 그것은 (일반적인 순진한 접근 방법이다 문자열 조작 및 구문 분석,보다 훨씬 더 나은) 용도에 충분히 빠른 거의 확실 매우 빠르게, 그리고 것입니다. GetBits를 사용하는 오뎃의 상세한 정보와 함께가는

1

, 나는, 바이트는 단지 8 비트입니다 당신이, 32 비트 INT의`bits`, 그리고 바이트를 의미하지 않는다이

const int EXP_MASK = 0x00FF0000; 
bool hasDecimal = (Decimal.GetBits(value)[3] & EXP_MASK) != 0x0; 
+0

나는 이것이 작동한다고 생각하지 않는다. 1.0m의 결과는 사실입니다. –

관련 문제