12,507,862 members (56,223 online)
alternative version

27.7K views
13 bookmarked
Posted

# .NET Rational (fraction) value type using Decimals, written in C#

, 24 Jan 2006 CPOL
 Rate this:
Implements a Rational datatype.

## Introduction

The class presented in this article implements a rational value type with basic mathematical functionality.

## Using the code

This class has no public constructors.

Implicit casting to/from `Int64` (and therefore other integer types) and decimal (and therefore `float` and `double`) is supported.

```// 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 ;```

Conversion from decimal can be controlled by the `ConversionMethod` `static` property. Currently, the `DecimalConversionMethod` enumeration defines two values: `Decimal` and `BestGuess`. `Decimal` simply uses a power of ten as the denominator. `BestGuess` tries (with some success) to determine what numbers can be divided to produce the value.

```// 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 ;```

Strings containing expressions can be assigned with the `ParseInfix` and `ParseRpn` methods.

```// 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 /" ) ;```

See my `PIEBALD.Lib.LibRpn` class for information on how infix is transformed to RPN.

The mathematical operators (+, -, *, /, %, ^ (exponentiation)) are supported. There are other static and instance properties as well.

## History

• First posted - 2006/01/16.

## Share

 Software Developer (Senior) United States
BSCS 1992 Wentworth Institute of Technology

Originally from the Boston (MA) area. Lived in SoCal for a while. Now in the Phoenix (AZ) area.

OpenVMS enthusiast, ISO 8601 evangelist, photographer, opinionated SOB, acknowledged pedant and contrarian

---------------

"Using fewer technologies is better than using more." -- Rico Mariani

"Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’" -- Steve McConnell

"Every time you write a comment, you should grimace and feel the failure of your ability of expression." -- Unknown

"If you need help knowing what to think, let me know and I'll tell you." -- Jeffrey Snover [MSFT]

"Typing is no substitute for thinking." -- R.W. Hamming

"I find it appalling that you can become a programmer with less training than it takes to become a plumber." -- Bjarne Stroustrup

ZagNut’s Law: Arrogance is inversely proportional to ability.

"Well blow me sideways with a plastic marionette. I've just learned something new - and if I could award you a 100 for that post I would. Way to go you keyboard lovegod you." -- Pete O'Hanlon

"linq'ish" sounds like "inept" in German -- Andreas Gieriet

"Things would be different if I ran the zoo." -- Dr. Seuss

"Wrong is evil, and it must be defeated." –- Jeff Ello

"A good designer must rely on experience, on precise, logical thinking, and on pedantic exactness." -- Nigel Shaw

“It’s always easier to do it the hard way.” -- Blackhart

“If Unix wasn’t so bad that you can’t give it away, Bill Gates would never have succeeded in selling Windows.” -- Blackhart

"Omit needless local variables." -- Strunk... had he taught programming

## You may also be interested in...

 Pro Pro

 First Prev Next
 Looks some code is missed. Member 257010323-Mar-09 1:51 Member 2570103 23-Mar-09 1:51
 Re: Looks some code is missed. PIEBALDconsult23-Mar-09 5:03 PIEBALDconsult 23-Mar-09 5:03
 Re: Looks some code is missed. Member 257010325-Mar-09 7:35 Member 2570103 25-Mar-09 7:35
 Re: Looks some code is missed. PIEBALDconsult25-Mar-09 8:39 PIEBALDconsult 25-Mar-09 8:39
 Re: Looks some code is missed. Member 257010325-Mar-09 20:05 Member 2570103 25-Mar-09 20:05
 Last Visit: 31-Dec-99 18:00     Last Update: 28-Sep-16 13:27 Refresh 1