/.     Safe1-xArbitrary precision decimal type. Programs should do decimal arithmetic with this type and only convert to other instances of  DecimalRawY where required by an external interface. This will avoid issues with integer overflows.SUsing this type is also faster because it avoids repeated conversions to and from Integer.Raw decimal arithmetic type constructor. A decimal value consists of an integer mantissa and a negative exponent which is interpreted as the number of decimal places. The value stored in a  Decimal d is therefore equal to: *decimalMantissa d / (10 ^ decimalPlaces d)The Show& instance will add trailing zeros, so show $ Decimal 3 1500' will return "1.500". Conversely the ReadB instance will use the decimal places to determine the precision.MConvert a real fractional value into a Decimal of the appropriate precision. Convert a  DecimalRaw from one base representation to another. Does not check for overflow in the new representation. Only use after using "roundTo" to put an upper value on the exponent, or to convert to a larger representation. Convert a  DecimalRaw# from one base to another. Returns Nothing* if this would cause arithmetic overflow.Round a  DecimalRaw@ to a specified number of decimal places. If the value ends in 5A then it is rounded to the nearest even value (Banker's Rounding) Round a  DecimalRawo to a specified number of decimal places using the specified rounding function. Typically this will be one of floor, ceiling, truncate or round . Note that roundTo == roundTo' round2Parse a Decimal value. Used for the Read instance.  Divide a  DecimalRaw value into one or more portions. The portions will be approximately equal, and the sum of the portions is guaranteed to be the original value.The portions are represented as a list of pairs. The first part of each pair is the number of portions, and the second part is the portion value. Hence 10 dollars divided 3 ways will produce [(2, 3.33), (1, 3.34)].  Allocate a  DecimalRawy value proportionately with the values in a list. The allocated portions are guaranteed to add up to the original value.Some of the allocations may be zero or negative, but the sum of the list must not be zero. The allocation is intended to be as close as possible to the following: Rlet result = allocate d parts in all (== d / sum parts) $ zipWith (/) result parts  Multiply a  DecimalRaw by a RealFrac value.RCount the divisors, i.e. the count of 2 divisors in 18 is 1 because 18 = 2 * 3 * 3 pTry to convert Rational to Decimal with absolute precision return string with fail description if not convertedGReduce the exponent of the decimal number to the minimal possible valueDenominator basedividing value0The count of divisors and the result of division       $Decimal-0.5.1-6HsaxqU5nEa3eBqXTbWg3f Data.DecimalDecimal DecimalRaw decimalPlacesdecimalMantissarealFracToDecimalunsafeDecimalConvertdecimalConvertroundToroundTo'divideallocate*.eitherFromRationalnormalizeDecimal$fRealFracDecimalRaw$fRealDecimalRaw$fNumDecimalRaw$fOrdDecimalRaw$fEqDecimalRaw$fReadDecimalRaw$fShowDecimalRaw$fEnumDecimalRaw$fNFDataDecimalRaw$fFractionalDecimalRaw readDecimalPfactorN