Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to simplify fractions in C#?

Tags:

c#

math

fractions

I'm looking for a library or existing code to simplify fractions.

Does anyone have anything at hand or any links?

P.S. I already understand the process but really don't want to rewrite the wheel

Update

Ok i've checked out the fraction library on the CodeProject BUT the problem I have is a little bit tricker than simplifying a fraction.

I have to reduce a percentage split which could be 20% / 50% / 30% (always equal to 100%)

like image 439
Andrew Harry Avatar asked May 31 '10 02:05

Andrew Harry


4 Answers

I think you just need to divide by the GCD of all the numbers.

void Simplify(int[] numbers)
{
    int gcd = GCD(numbers);
    for (int i = 0; i < numbers.Length; i++)
        numbers[i] /= gcd;
}
int GCD(int a, int b)
{
    while (b > 0)
    {
        int rem = a % b;
        a = b;
        b = rem;
    }
    return a;
}
int GCD(int[] args)
{
    // using LINQ:
    return args.Aggregate((gcd, arg) => GCD(gcd, arg));
}

I haven't tried the code, but it seems simple enough to be right (assuming your numbers are all positive integers and you don't pass an empty array).

like image 55
Gabe Avatar answered Nov 13 '22 16:11

Gabe


You can use Microsoft.FSharp.Math.BigRational, which is in the free F# Power Pack library. Although it depends on F# (which is gratis and included in VS2010), it can be used from C#.

BigRational reduced = BigRational.FromInt(4)/BigRational.FromInt(6);
Console.WriteLine(reduced);
    2/3
Console.WriteLine(reduced.Numerator);
    2
Console.WriteLine(reduced.Denominator);
    3
like image 21
Matthew Flaschen Avatar answered Nov 13 '22 16:11

Matthew Flaschen


The best example of Fraction (aka Rational) I've seen is in Timothy Budd's "Classic Data Structures in C++". His implementation is very good. It includes a simple implementation of GCD algorithm.

It shouldn't be hard to adapt to C#.

like image 29
duffymo Avatar answered Nov 13 '22 18:11

duffymo


This library looks like it might be what you need:

var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;

Although, I haven't tested it, so it looks like you may need to play around with it to get it to work.

like image 30
MiffTheFox Avatar answered Nov 13 '22 17:11

MiffTheFox