Here's an interesting bit of the C# specifiction, from section 4.1.6:
Floating-point operations may be
  performed with higher precision than
  the result type of the operation. For
  example, some hardware architectures
  support an “extended” or “long double”
  floating-point type with greater range
  and precision than the double type,
  and implicitly perform all
  floating-point operations using this
  higher precision type. Only at
  excessive cost in performance can such
  hardware architectures be made to
  perform floating-point operations with
  less precision, and rather than
  require an implementation to forfeit
  both performance and precision, C#
  allows a higher precision type to be
  used for all floating-point
  operations. Other than delivering more
  precise results, this rarely has any
  measurable effects.
It is possible that this is one of the "measurable effects" thanks to that call to Ceiling. Taking the ceiling of a floating point number, as others have noted, magnifies a difference of 0.000000002 by nine orders of magnitude because it turns 15.99999999 into 16 and 16.00000001 into 17. Two numbers that differ slightly before the operation differ massively afterwards; the tiny difference might be accounted for by the fact that different machines can have more or less "extra precision" in their floating point operations.
Some related issues:
To address your specific problem of how to compute an aspect ratio from a float: I'd possibly solve this a completely different way.  I'd make a table like this:
struct Ratio
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public Ratio (int x, int y) : this()
    {
        this.X = x;
        this.Y = y;
    }
    public double AsDouble() { return (double)X / (double)Y; }
}
Ratio[] commonRatios = { 
   new Ratio(16, 9),
   new Ratio(4, 3), 
   // ... and so on, maybe the few hundred most common ratios here. 
   // since you are pinning results to be less than 20, there cannot possibly
   // be more than a few hundred.
};
and now your implementation is
public string AspectRatioAsString(double ratio)      
{ 
    var results = from commonRatio in commonRatios
                  select new {
                      Ratio = commonRatio, 
                      Diff = Math.Abs(ratio - commonRatio.AsDouble())};
    var smallestResult = results.Min(x=>x.Diff);
    return String.Format("{0}:{1}", smallestResult.Ratio.X, smallestResult.Ratio.Y);
}
Notice how the code now reads very much like the operation you are trying to perform: from this list of common ratios, choose the one where the difference between the given ratio and the common ratio is minimized.