2012-06-16 6 views
1

int로 double 유형을 나누고 싶습니다. 난 문자열 형식으로 2 deicmal 장소에서 결과가 필요합니다. 스택 효율면에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?효율적으로 나눕니다.

double d=321321321313131233213213213213; 
int i=123; 

ToString(d/i); //what do I get when I do this? A double? A float? 

     public String ToString(float? result) //what should I cast the result? 
     { 
      return @String.Format("{0:#,0.##;} divided double by int", result); 
     } 
+1

함수 이름 앞에'@ ~는 C#에서는 아무 것도 수행하지 않습니다. 컴파일러 오류가 발생합니다. –

+0

제목 앞에 "C#"을 표시하지 마십시오. "[스택 오버플로는 SEO 기술이 필요하지 않습니다.] (http://meta.stackexchange.com/a/130208)"를 참조하십시오. –

+1

@Cole, 그건 사실이 아닙니다. 여기 * 불필요합니다. 그러나 그것은 합법적입니다. ('@'는 * 식별자 *로서 - 예약어가 될 것입니다. 메소드 이름은 식별자입니다.) –

답변

5

ToString을 (D/I); // 이것을 할 때 나는 무엇을 얻는가? 두 배? 부유물?

두 배가됩니다. int를 double로 나누면 double 값이됩니다.

public String ToString (float? result) // 결과를 캐스팅해야합니까?

값이 double이므로 여기에서 double을 사용하는 것이 좋습니다. nullable 형식을 얻지 못할 것이며 결과적으로 float을 얻지 못할 것이므로 float?을 사용하는 것은 전적으로 부적절한 것입니다.

스택 효율성면에서 가장 좋은 방법은 무엇입니까?

물론 이것은 걱정할 필요가 없습니다. 프로필을 작성하고 실제로 문제가 발생하지 않는 한. 문자열을 작성하는 것은 분할 작업보다 훨씬 비쌉니다. 둘 다 성능 측면에서 핫스팟이 될 수 없습니다.


이 그냥 double.ToString("N2")을 사용하는 것입니다 처리 할 수있는 깨끗한 방법, 즉 : 당신이 전체 포맷 문자열을 원하는 경우에

double result = d/i; 
string resultAsString = result.ToString("N2"); 

, 당신은 사용할 수 있습니다

string resultAsString = string.Format("{0:N2} divided double by int", result); 
2

Ok. 먼저 double, 이 아닌double? 또는 float?이 표시됩니다. 수학 함수는 이 아니어야합니다.은 null 입력 가능 유형을 반환합니다. 무한대가 null으로 표시된다고 가정하면 틀린 것입니다. 무한 성은 비트에 의해 결정됩니다. double이 무한대인지 확인하려면 Double.IsInfinity(double)을 사용하십시오.

[SecuritySafeCritical] 
public static unsafe bool IsInfinity(double d) 
{ 
    return ((*(((long*) &d)) & 0x7fffffffffffffffL) == 0x7ff0000000000000L); 
} 

스택 효율성의 관점에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까 ?

코딩 호러에서 tragedies of micro optimization을 살펴 보시기 바랍니다.


기능은 다음과 같습니다. 그것은 완전히 불필요합니다. 가장 좋은 방법은 Double.ToString(...)입니다 :

double val = d/i; 
string result = val.ToString("N2"); 

그러나 String.Format(...)를 사용하는 경우, 당신은 사용할 수 있습니다

double val = d/i; 
string result = string.Format("{0:N2} divided double by int", val); 
+0

그냥 참고 - 캐스트가 필요하지 않습니다 - Int32는이 경우 Double으로 자동 확장됩니다. –

+0

@ReedCopsey 흠. 내가'float * int'를했을 때, 나는 캐스팅 할 때까지 앱에서 0을 얻었습니다. –

+0

Cole : C# 언어 사양 "7.3.6.2 이진 숫자 승격"이 처리합니다. "두 피연산자 중 하나가 double 유형이고 다른 피연산자가 double 유형으로 변환됩니다." (소수 첫째, 이중, 그 다음에 뜨다) –

-1

해키 솔루션 :

소수 자릿수가 2 개만 필요한 경우 이중에 100을 곱하고 정수를 입력 한 다음 i으로 나눕니다.

이제 결과의 문자열을 가져와 마지막 두 문자 앞에 점을 추가하십시오.

음수 값과 반올림 문제의 경우를 처리하는 것을 잊지 마십시오.

효율성에 대해 정말로 신경 쓰는 경우 분수 나누기는 정수 나누기와 비교할 때 느린 프로세스입니다.

+0

비트 이동은 어떻습니까? – River