diff --git a/Data/DFrac.hs b/Data/DFrac.hs
new file mode 100644
--- /dev/null
+++ b/Data/DFrac.hs
@@ -0,0 +1,56 @@
+module Data.DFrac (DFrac(..), setPrec) where
+import GHC.Read
+import Data.Ratio
+import Data.Scientific
+
+data DFrac = DFrac {
+    places :: Int,
+    number :: Rational
+  }
+
+instance Eq DFrac where
+  x == y = number x == number y
+instance Ord DFrac where
+  compare x y = compare (number x) (number y)
+
+instance Num DFrac where
+  x + y = dfrac min x y $ number x + number y
+  x - y = dfrac min x y $ number x - number y
+  x * y = dfrac min x y $ number x * number y
+  abs x = DFrac (places x) $ abs $ number x
+  signum x = DFrac (places x) $ signum $ number x
+  fromInteger = DFrac 16 . fromInteger
+instance Fractional DFrac where
+  x / y = dfrac min x y $ number x / number y
+  fromRational = DFrac 16 . fromRational
+instance Real DFrac where
+  toRational = number
+instance RealFrac DFrac where
+  properFraction x = (a, DFrac (places x) b)
+    where
+      (a, b) = properFraction $ number x
+  
+instance Read DFrac where
+  readsPrec p z = map (\(d, s) -> (DFrac 16 $ toRational d, s)) r
+    where
+      r :: [(Scientific, String)]
+      r = readsPrec p z
+  readListPrec = readListPrecDefault
+  readList = readListDefault
+instance Show DFrac where
+  show (DFrac p r) = show i ++ "." ++ tail (show f)
+    where
+      n = numerator r
+      d = denominator r
+      i = n `div` d
+      f :: Integer
+      f = truncate $ (10^p) * (1+(snd $ properFraction r))
+
+setPrec :: Int -> DFrac -> DFrac
+setPrec p r = r { places = p }
+
+dfrac :: (Int -> Int -> Int) -> DFrac -> DFrac -> Rational -> DFrac
+dfrac f x y z = DFrac (prec f x y) z
+
+prec :: (Int -> Int -> Int) -> DFrac -> DFrac -> Int
+prec f x y = f (places x) (places y)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2014 George Rogers
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/dfrac.cabal b/dfrac.cabal
new file mode 100644
--- /dev/null
+++ b/dfrac.cabal
@@ -0,0 +1,24 @@
+-- Initial dfrac.cabal generated by cabal init.  For further documentation,
+--  see http://haskell.org/cabal/users-guide/
+
+name:                dfrac
+version:             0.1.1.0
+synopsis:            A package for precise decimal arithmatic using rationals.
+description:            A package for precise decimal arithmatic using rationals.
+license:             MIT
+license-file:        LICENSE
+author:              George Rogers
+maintainer:          grogers385@gmail.com
+-- copyright:           
+category:            Math
+build-type:          Simple
+-- extra-source-files:  
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Data.DFrac
+  -- other-modules:       
+  -- other-extensions:    
+  build-depends:       base >=4 && <5, scientific >=0.3 && <0.4
+  -- hs-source-dirs:      
+  default-language:    Haskell2010
