2011-08-12 3 views
10

가능한 중복 : 나는 모든 숫자가 double로 저장해야하는 독특한 상황이
How to determine if a decimal/double is an integer?C#을, * 결정

데이터 형식은 내 데이터베이스에 있지만 특정 조건에서만 정밀도가 정수 수준을 넘어 가치가 있습니다.

처음에는 int을 사용한 다음 이러한 고유 한 부분 일치가 발생할 때 새 테이블로 추상화하려고 시도했지만 그 후에 지나치게 어리 석고 내 시간을 낭비한다는 것을 알 수 있습니다.

나는 doubleint으로 바꿀 수 있음을 알고 있습니다. 쉽습니다. 나는 그것을 어떻게 번역하는지 안다. 내가 모르는 것은 그것을 번역하는 방법을 시험하는 방법이다. 나는 기본적으로 짧고 쉬운 방법을 생각해 내고 싶다.

이 숫자는 실제로 이중인가 아니면 int인가?

int 인 경우 (그리고 대부분의 시간이 될 때), 나는 하나의 것으로 바꾸고 그대로 취급 할 것입니다. 그러나 요구 사항의 고유성으로 인해 데이터베이스의 모든 것을 여전히 double으로 저장해야합니다.

아이디어가 있으십니까? 나는 이것이 초보자 질문 인 것을 안다. 그리고 나는 몇 시간 동안 주위에 탐색 해 보았고, 아직도 혼란 스럽다.

+0

그래서 그냥 테스트 할 것입니다 시도?또는 값에 소수 부분이있는 경우 좀 더 걱정합니까? – Yuck

+0

이 세상에서 $ 1.00의 가격은'int' 또는'double'입니까? * 트릭 질문 : '십진법'입니다. * –

+1

'손실없이'라는 것은 무엇을 의미합니까? 10.000은 손실없이 10으로 바뀔 수 있지만 10.001은 그렇지 못하다는 말입니까? 어떤 경우에는 0을 말할 수 없으므로 손실이 얼마나 큰지를 정의해야합니다. +/- 0.001 또는 무엇이든 말해야합니다. – iandotkelly

답변

6

This similar post에는 두 자리 또는 소수에 소수점 이하 자릿수가 있는지 확인하는 방법이 나와 있습니다. 이를 사용하여 어떤 유형인지 판별하고 적절히 저장하십시오. 해당 게시물에서

허용 대답 : 부동 소수점 숫자를 들어

n % 1 == 0는 일반적으로 소수점 과거 아무것도가 있는지 확인하는 방법입니다.

public static void Main (string[] args) 
{ 
    decimal d = 3.1M; 
    Console.WriteLine((d % 1) == 0); 
    d = 3.0M; 
    Console.WriteLine((d % 1) == 0); 
} 

출력 :

False 
True 
+0

예, 이것이 내가 찾고있는 것입니다. 모듈러스 명령을 잊어 버렸습니다. 고맙습니다. – Derek

10

int에 출연을하고 여전히 동일한 있는지 참조 :

if ((int)val == val) 

(int)val 어떤 소수 부분을 자릅니다.

숫자가 너무 커서 double에 완전한 정밀도를 유지할 수 없을 때 예기치 않게 작동 할 수 있습니다.

+0

캐스트 대신에'Math.Truncate'를 사용하면 어떤 이점이 있습니까? – FishBasketGordo

9
double d = ...; 

if(d == (int)d) 
    //is int 
else 
    //is not int 

물론 정밀도 문제로 인해 100 % 작동하지 않을 수 있습니다.

double d = ...; 

if(Math.Abs(d - (int)d) < Epsilon) //const double Epsilon = 0.000001; 
    //is int 
else 
    //is not int 
0

들어오는 값이 최대 정수 값보다 큰 경우이

double x = ...... 

if (Math.truncate(x) == x) 

....... (is integer, unless its so big its outside the bounds)