2011-12-07 2 views
0

결과에 무한 소수가있는 분수로 일부 계산을 수행해야합니다. 예 :무한 십진수 저장 C#

240/360=0.666666... 

출력은 무한 소수 가지며, I는 정수를 곱 때 결과는 정수이어야한다. 그래서 이런 식으로 코딩했습니다

result = someInteger * decimal.divide(240/360); 

이 (someInteger = 2700과 시도를)하지만 결과는 소수점 값 일부 계산기 또는 출력 정수 결과를 것조차 스프레드 시트를 가지고있다. C#에서 동일한 결과를 얻으려면 어떻게해야합니까?

감사

+0

위/아래로 반올림 하시겠습니까?'var myIntResult = (int) result;; – PostMan

+0

연산이 정수를 반환하면 반올림하거나 잘라 버릴 수 없으므로 실제로 시도하려고합니다. –

답변

12

출력에 무한 소수가 있고이 값을 정수로 곱하면 결과는 정수 여야합니다.

실제로 발생하지 않습니다.

할 수있는 것은 라운딩 (곱하기 후)입니다.

또는 대신

result = someInteger * decimal.divide(240/360); 

의 당신은

result = someInteger * 240/360; 

문제가 그와 함께 무엇을 사용할 수 있습니까?

당신은 분수와 협력 당신이 특별한 유형이 필요합니다 정밀도를 유지 정말 심각한 :

struct Rational 
{ 
    public readonly int Numerator; 
    public readonly int Denominator; 

    // lots of members, including operators 
} 

는이 작업을 수행하는 방법에 대한 libraries and examples있다.

하지만 여전히 정확하게 π을 나타낼 수는 없습니다.

+0

제안 사항 (result = someInteger * 240/360;) 우선 순위가 더 높은 작업은 무엇입니까? 또는 먼저 실행될 것인가? –

+0

왼쪽에서 오른쪽 ... someInteger * 240, 그 다음/360에 대한 답. –

+5

물론 원한다면 pi를 정확하게 나타낼 수 있습니다. * 정수형 합리적인 라이브러리 *를 사용하지 않아도됩니다. –

0

사용 Math.Round()

result = someInteger * decimal.divide(240/360); 

result = Math.Round(result); 

당신이 옳은 일을 요청하는지 정수입니다 갈까요?

+0

결과를 반올림하고 싶지 않습니다. 출력이 실제로 정수 값인 지 알고 싶습니다. –

+1

정수 인 경우 true/false 문을 반환하는 메서드를 원하십니까? 그게 네 질문이 말하는 바가 아니기 때문이야. –

+0

옙, 실제로 코드를 비교해 보았습니다.하지만 제 문제는이 operatin이었습니다 –

1

분자와 분모를 정수로 따로 저장하고 나누기 전에 분자를 곱하면 1/3 * 2가 여전히 무한 십진수를 갖지만 모든 문제가 해결됩니다. 이것은 또한 유리수에만 적용됩니다.

+0

먼저 분자를 수행하면 유형에 따라 산술 오버플로가 발생하는 문이 열립니다. 먼저 나누면 무한 십진법 문제로 되돌아갑니다. –

+0

네, 그건 사실 아주 사소한 문제입니다. – smitec

+0

@AustinSalonen : 사실입니다 만 산술 오버 플로우로 끝날 수도 있습니다. 더 큰 비트 공간에서 산술 연산을 수행하면 해결할 수 있습니다. 'int'를 입력으로 받아 들여'int'를 반환하지만'long'을 내부적으로 사용하면 대다수의 문제를 피해야합니다. – Guvante

0

많은 응용 프로그램이 최종적으로 사용자에게 필요한/출력되는 것보다 더 높은 수준의 정확도로 중간 계산을 수행하여 의사 분수 수학을 수행합니다 (Office에서이를 수행함). 이것이 당신이 원하는 것이 아니고, 진정한 분수 수학을 수행하고 싶다면 Fractions 구현을 검색하십시오. 괜찮은 구현 인 것 같습니다. here. 그러한 구현의 문제점은 효율적이지 못하여 기능상으로 정확하다는 것입니다. 따라서 애플리케이션이 수백만 분의 연산을 수행해야하는 경우 성능이 저하 될 수 있습니다.