首页 > 代码库 > C#实现的分数结构(编辑中)

C#实现的分数结构(编辑中)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace RainbowFraction{    public struct RainbowFraction : IComparable,  IComparable<RainbowFraction>, IEquatable<RainbowFraction>    {        #region 字段        private long _numerator;        private long _denominator;        #endregion        #region 属性        /// <summary>        /// 分子        /// </summary>        public long Numerator        {            set             {//分母分子不能同为负                if (value * _denominator >= 0)                {                    _numerator = Math.Abs(value);                    _denominator = Math.Abs(_denominator);                }                else                {                    _numerator = Math.Abs(value) * -1;                    _denominator = Math.Abs(_denominator);                }            }            get { return _numerator; }        }        /// <summary>        /// 分母        /// </summary>        public long Denominator        {            get { return _denominator; }            set            {//分母分子不能同为负                if (value != 0)                {                    if (_numerator * value >= 0)                    {                        _numerator = Math.Abs(_numerator);                        _denominator = Math.Abs(value);                    }                    else                    {                        _numerator = Math.Abs(_numerator) * -1;                        _denominator = Math.Abs(value);                    }                }                else                {                    throw new RainbowFractionException("分母不可为0.");                }            }        }        /// <summary>        /// 值        /// </summary>        public double Value        {            get { return (double)Numerator / (double)Denominator; }        }        #endregion        #region 构造        /// <summary>        /// 以分子分母构造        /// </summary>        /// <param name="srcNum"></param>        /// <param name="srcDen"></param>        public RainbowFraction(long srcNum, long srcDen)        {            if (srcDen == 0)            {                throw new RainbowFractionException("分母不可为0");            }            if (srcNum * srcDen >= 0)            {                _numerator = Math.Abs(srcNum);                _denominator = Math.Abs(srcDen);            }            else            {                _numerator = Math.Abs(srcNum) * -1;                _denominator = Math.Abs(srcDen);            }        }        /// <summary>        /// 以double构造        /// </summary>        /// <param name="srcDouble"></param>        public RainbowFraction(double srcDouble)        {            _numerator = 0;            _denominator = 1;            RainbowFraction tmp = ToRainbowFraction(srcDouble);            _numerator = tmp.Numerator;            _denominator = tmp.Denominator;        }        /// <summary>        /// 以字符串构造        /// </summary>        /// <param name="srcString"></param>        public RainbowFraction(string srcString)        {            _numerator = 0;            _denominator = 1;            RainbowFraction tmp = ToRainbowFraction(srcString);            _numerator = tmp.Numerator;            _denominator = tmp.Denominator;        }        #endregion        #region 方法        /// <summary>        /// double to fraction        /// </summary>        /// <param name="srcDouble"></param>        /// <returns></returns>        public static RainbowFraction ToRainbowFraction(double srcDouble)        {            RainbowFraction result = new RainbowFraction();            try            {                checked                {                    string srcString = srcDouble.ToString();                    double tmpNum = srcDouble;                    long tmpDen = 1;                    while (srcString.IndexOf(‘E‘) > 0)                    {                        tmpNum *= 10;                        tmpDen *= 10;                        srcString = tmpNum.ToString();                    }                    if (srcString.Contains(‘.‘))                    {                        int lengthAfterDot = srcString.Split(‘.‘)[1].Length;                        while (lengthAfterDot > 0)                        {                            tmpNum *= 10;                            tmpDen *= 10;                            lengthAfterDot--;                        }                    }                    result = new RainbowFraction((long)Math.Round(tmpNum), tmpDen);                }            }            catch (OverflowException)            {                throw new RainbowFractionException("转换时发生溢出");            }            catch (Exception)            {                throw new RainbowFractionException("转换失败");            }            return result;        }        /// <summary>        /// string to double        /// </summary>        /// <param name="srcString"></param>        /// <returns></returns>        public static RainbowFraction ToRainbowFraction(string srcString)        {            RainbowFraction result = new RainbowFraction();            try            {                double srcDouble = 0;                Regex fracRegex = new Regex(@"^\d+\/\d+$");                if (double.TryParse(srcString, out srcDouble))                {//形如1.23                    result = ToRainbowFraction(srcDouble);                }                else if (fracRegex.IsMatch(srcString))                {//形如1/23                    result = new RainbowFraction(Convert.ToInt64(srcString.Split(‘/‘)[0]), Convert.ToInt64(srcString.Split(‘/‘)[1]));                }                else                {                    throw new RainbowFractionException("输入字符串有误");                }            }            catch            {                throw new RainbowFractionException("转换失败");            }            return result;        }        /// <summary>        /// 转化为字符串        /// </summary>        /// <returns></returns>        public override string ToString()        {            return Denominator == 0 ? "NaN" : string.Format("{0}/{1}", Numerator, Denominator);        }        #endregion        #region 接口实现        public int CompareTo(object obj)        {            int result = 0;            double tmpValue = http://www.mamicode.com/0;"比较失败");            }            return result;        }        /// <summary>        /// 分数比较        /// </summary>        /// <param name="other"></param>        /// <returns></returns>        public int CompareTo(RainbowFraction other)        {            int result = 0;            if (this > other)            {                result = 1;            }            else if (this < other)            {                result = -1;            }            return result;        }        /// <summary>        /// 分数判等        /// </summary>        /// <param name="other"></param>        /// <returns></returns>        public bool Equals(RainbowFraction other)        {            return this.Value =http://www.mamicode.com/= other.Value;"srcDouble"></param>        /// <returns></returns>        public static implicit operator RainbowFraction(double srcDouble)        {            RainbowFraction result = new RainbowFraction(srcDouble);            return result;        }        /// <summary>        /// fraction to double        /// </summary>        /// <param name="srcFrac"></param>        /// <returns></returns>        public static implicit operator double(RainbowFraction srcFrac)        {            return srcFrac.Value;        }        #endregion        #region 运算符重载        //一元逻辑运算        public static RainbowFraction operator -(RainbowFraction srcFrac)        {            return new RainbowFraction(srcFrac.Numerator * -1, srcFrac.Denominator);        }        //二元逻辑运算        public static bool operator >(RainbowFraction left, RainbowFraction right)        {            return left.Value > right.Value;        }        public static bool operator >=(RainbowFraction left, RainbowFraction right)        {            return left.Value >= right.Value;        }        public static bool operator <(RainbowFraction left, RainbowFraction right)        {            return left.Value < right.Value;        }        public static bool operator <=(RainbowFraction left, RainbowFraction right)        {            return left.Value < right.Value;        }        public static bool operator ==(RainbowFraction left, RainbowFraction right)        {            return left.Value =http://www.mamicode.com/= right.Value;>

  

C#实现的分数结构(编辑中)