It should also be noted that the epsilon value chosen in the example below is somewhat arbitrary. The value at a absolute maximum should be 1E-6, but it is acceptable for values all the way to 1E-12 (and possibly smaller). Just remember that the whole point of it is to provide a work around for the numerical error the results from storing values in a binary mantissa, with a binary exponent. I don't doubt that there is/are thes(is)/(es) on this subject with a statistical study of what a good epsilon is, but for the purposes of a non-critical 3D application I would say you can just fudge it.
struct Real{
   
   public const float EPSILON = 0.0000001f;
   private float number;
   
   public float Value{
      get{ return this.number; }
      set{ this.number = value; }
   }
   public Real(float num){
      this.number = num;
   }
   public static bool operator==(Real lhs, Real rhs){
      if (Abs(lhs.number - rhs.number) < EPSILON){
         return true;
      }
      return false;
   }
   
   // Implement "Equals" if Java or C# using == operator
   // ...
   public static Real operator/(Real lhs, Real rhs){
      ASSERT(Abs(rhs.number) >= EPSILON);
      Real result = new Real(lhs.number/rhs.number);
      return result;
   }
   public static Real operator*(Real lhs, Real rhs){
      Real result = new Real(lhs*rhs);
      return result;
   }
   // ... all other operators   
}
 
