65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 使用十进制数 (Decimals) 实现的有理数 (分数) 值类型,用 C# 编写

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.28/5 (6投票s)

2006年1月24日

CPOL
viewsIcon

38171

downloadIcon

235

实现了一个有理数数据类型。

引言

本文中介绍的类实现了一个带有基本数学功能的有理数值类型。

使用代码

该类没有公共构造函数。

支持从 Int64(因此也支持其他整数类型)和十进制数(因此也支持 floatdouble)的隐式转换。

// Cast from int
PIEBALD.Types.Rational a = 1 ;
// Cast from double (via decimal)
PIEBALD.Types.Rational b = 2.3 ;
// Cast from decimal
PIEBALD.Types.Rational c = 4.5M ;

可以通过 ConversionMethod static 属性控制从十进制数进行的转换。目前,DecimalConversionMethod 枚举定义了两个值:DecimalBestGuessDecimal 简单地使用 10 的幂作为分母。BestGuess 尝试(并取得一定成功)确定哪些数字可以相除以产生该值。

// This is the default
PIEBALD.Types.Rational.ConversionMethod = 
               DecimalConversionMethod.Decimal;
// Yields 33333333333333333333
//    33333333/10000000000000000000000000000
PIEBALD.Types.Rational d = 1M / 3M ;
PIEBALD.Types.Rational.ConversionMethod = 
             DecimalConversionMethod.BestGuess;
// Yields 1/3
PIEBALD.Types.Rational e = 1M / 3M ;

可以使用 ParseInfixParseRpn 方法分配包含表达式的字符串。

// Convert from string
PIEBALD.Types.Rational f = 
   PIEBALD.Types.Rational.ParseInfix ( "1/2" ) ;
// Convert from string
PIEBALD.Types.Rational g = 
   PIEBALD.Types.Rational.ParseInfix ( "(1/2) / (3/4)" ) ;
// Convert from string
PIEBALD.Types.Rational h = 
   PIEBALD.Types.Rational.ParseRpn ( "1 2 /" ) ;

有关中缀表达式转换为后缀表达式的信息,请参阅我的 PIEBALD.Lib.LibRpn 类。

支持数学运算符(+、-、*、/、%、^(指数运算))。还有其他的静态和实例属性。

历史

  • 首次发布 - 2006/01/16。
© . All rights reserved.