13,256,446 members (50,298 online)
Add your own
alternative version

#### Stats

29.5K views
212 downloads
13 bookmarked
Posted 24 Jan 2006

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

, 24 Jan 2006
 Rate this:
Please Sign up or sign in to vote.
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.

## License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

## About the Author

 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

"Use vertical and horizontal whitespace generously. Generally, all binary operators except '.' and '->' should be separated from their operands by blanks."

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

## You may also be interested in...

 Pro Pro

## Comments and Discussions

 First Prev Next
 Looks some code is missed. Member 257010323-Mar-09 2:51 Member 2570103 23-Mar-09 2:51
 Re: Looks some code is missed. PIEBALDconsult23-Mar-09 6:03 PIEBALDconsult 23-Mar-09 6:03
 Re: Looks some code is missed. Member 257010325-Mar-09 8:35 Member 2570103 25-Mar-09 8:35
 Re: Looks some code is missed. PIEBALDconsult25-Mar-09 9:39 PIEBALDconsult 25-Mar-09 9:39
 Re: Looks some code is missed. Member 257010325-Mar-09 21:05 Member 2570103 25-Mar-09 21:05
 Last Visit: 31-Dec-99 19:00     Last Update: 22-Nov-17 17:50 Refresh 1

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.171114.1 | Last Updated 24 Jan 2006
Article Copyright 2006 by PIEBALDconsult
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid