誤差

またやってしまったー。

public enum RoundingRule
{
  Ceiling, // 正の無限大へ
  Floor,   // 負の無限大へ
  Zero,    // ゼロへ
  IEEE,    // IEEE 準拠
}

public static int Round(int src, float pow, RoundingRule rule)
{
  float value = src * pow;

  switch (rule)
  {
    case RoundingRule.Ceiling: return (int) Math.Ceiling(value);
    case RoundingRule.Floor:   return (int) Math.Floor(value);
    case RoundingRule.IEEE:    return (int) Math.Round(value);
    case RoundingRule.Zero:    return Round(src, pow, 
                                   (src >= 0) ? RoundingRule.Floor
                                              : RoundingRule.Ceiling);
  }
}

以上、バグってるコード。

  foreach (RoundingRule rule in Enum.Getvalues(typeof(RoundingRule)))
  {  
    :
    Assert(21 == Round(20, 1.05F, rule));
    :
  }

とか、もろに失敗するわけで。