Я работаю над системой, которая должна принимать и отображать сложные дроби. Код для приема дробей и преобразования их в double
работает, но когда я хочу отобразить это значение, мне нужно преобразовать обратно в дробное представление.
РЕДАКТИРОВАТЬ: я исправил проблему переполнения, но это не решило дроби, такие как 1/3 или 5/6. Поэтому я разработал очень хакерский способ сделать это. У меня есть код, который генерирует десятичное представление каждой дроби от 0->64 до 1->64 и сохраняет наиболее упрощенную форму. Таким образом, я могу пройтись по списку, найти ближайшую дробь и просто отобразить ее. Выложу код, когда он у меня будет.
Теперь у меня есть код, который работает для подавляющего большинства чисел, но иногда я получаю крошечную дробь, например 1/321
. Это преобразуется в двойное, но не может быть преобразовано обратно, потому что в моем подходе числитель вызывает целочисленное переполнение.
Вот мой код, мне интересно, есть ли лучший подход или есть способ безопасно преобразовать их в длинные без потери точности, необходимой для правильного результата:
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);
}
Fraction
для передачи ваших значений вместо того, чтобы пытаться конвертировать туда и обратно? Как вы ожидаете обрабатывать повторяющиеся десятичные дроби? - person Steve Ruble   schedule 06.09.2014