Формат, повторяющий десятичную дробь - PullRequest
2 голосов
/ 19 февраля 2009

Мне нужно преобразовать десятичные значения в их дробные эквиваленты, аналогично этому предыдущий вопрос .

Я использую код, размещенный в одном из ответов, в качестве отправной точки, поскольку он в основном делает то, что мне нужно.

string ToMixedFraction(decimal x) {
int whole = (int) x;
int denominator = 64;
int numerator = (int)( (x - whole) * denominator );

if (numerator == 0) 
{
    return whole.ToString();
}
while ( numerator % 2 == 0 ) // simplify fraction
{
    numerator /= 2;
    denominator /=2;
}
return string.Format("{0} {1}/{2}", whole, numerator, denominator);
}

Как я уже сказал, по большей части этот код работает нормально, но мне нужно взять общие повторяющиеся десятичные значения (.3333333) и отобразить их пользователю как 1/3.

Кто-нибудь знает, как это можно сделать?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2009

С http://mathforum.org/library/drmath/view/61579.html

Возьмите количество цифр в повторяющейся части как числитель, возьмите 9 повторений с тем же количеством цифр и уменьшите дробь.

Например, .3 повторение аналогично 3/9. Уменьшите, разделив обе стороны на gcd (в данном случае 3), и вы получите 1 / 3.

Вам понадобится дополнительная математика, если вы можете извлечь повторяющуюся десятичную дробь из конечной десятичной дроби, например, 0,133333333.

3 голосов
/ 19 февраля 2009

Техника, которую я изучил в средней школе:

x = 0.33333
10 x = 3.33333

10x - x = 3.3333 - .3333

9x = 3

x = 3 / 9

Reduce 3/9 to 1/3.
0 голосов
/ 19 февраля 2009

Вот рецепт, который преобразует число с плавающей точкой в ​​ближайшую дробь с заданным пределом для знаменателя:

...