복잡한 분수를 받아들이고 표시해야하는 시스템에서 작업하고 있습니다. 분수를 받아들이고이를 double
으로 바꾸는 코드는 작동하지만, 그 값을 표시하려면 분수 표현으로 다시 변환해야합니다.십진법과 분수
편집 : overflow 문제가 수정되었지만 1/3 또는 5/6과 같은 분수를 해결하지 못했습니다. 그래서 나는 이것을하기에 매우 해킹 된 방법을 고안했다. 나는 모든 분수 0 -> 64 1 -> 64, 및 가장 단순화 된 폼을 저장하는 10 진수 표현을 생성하는 코드가 있습니다. 이렇게하면 목록을 반복하고 가장 가까운 소수점을 찾아 간단하게 표시 할 수 있습니다. 일단 내가 코드를 게시 할 것입니다.
대다수의 숫자에 대해 작동하는 코드가 있는데, 때로는 1/321
과 같은 작은 조각이 나옵니다. 이 방법은 double로 변환 되긴하지만 다시 변환 할 수는 없습니다. 왜냐하면 내 방식에서는 분자가 정수 오버플로를 발생시키기 때문입니다.
public static String DecimalToFraction(double dec)
{
string str = dec.ToString();
if (str.Contains('.'))
{
String[] parts = str.Split('.');
long whole = long.Parse(parts[0]);
long numerator = long.Parse(parts[1]);
long denominator = (long)Math.Pow(10, parts[1].Length);
long divisor = GCD(numerator, denominator);
long num = numerator/divisor;
long den = denominator/divisor;
String fraction = num + "/" + den;
if (whole > 0)
{
return whole + " " + fraction;
}
else
{
return fraction;
}
}
else
{
return str;
}
}
public static long GCD(long a, long b)
{
return b == 0 ? a : GCD(b, a % b);
}
잘 끝나지 않을 것입니다 이중에 진수 값을 퍼팅. Double은 2 진 유형입니다. –
앞뒤로 변환하지 않고 값을 전달하는 새로운'Fraction' 유형을 만들 수 있습니까? 반복되는 소수 자릿수를 어떻게 처리 할 것으로 예상합니까? –
@DavidHeffernan이 값을 저장하는 데 double을 사용하면 안되는 이유에 대해 혼란 스럽습니다. 대다수의 경우 전체 숫자와 단순 분수만으로는 충분할 것이라는 것을 이해했습니다. 나는이 복잡한 부분을 차단하는 결과를 초래할 수 있습니다. –