首页 > 代码库 > 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#实现的分数结构(编辑中)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。