@@ -46,11 +46,21 @@ fromNumber :: forall precision. KnownPrecision precision => Number -> Maybe (Fix
4646Approximate a `Number` as a `Fixed` value with the specified precision.
4747
4848```
49−> fromNumber 0.1234 :: Fixed P10000
50−fromNumber 0.1234 :: P100
49+> fromNumber 0.1234 :: Maybe (Fixed P10000)
50+(Just (fromNumber 0.1234 :: P10000))
5151
52−> fromNumber 0.1234 :: Fixed P100
53−fromNumber 0.12 :: P100
52+> fromNumber 0.1234 :: Maybe (Fixed P100)
53+(Just (fromNumber 0.12 :: P100))
54+```
55+
56+When given a finite `Number`, this function always succeeds: the number is
57+truncated (rounded towards zero) to the closest possible `Fixed` value.
58+This function only returns `Nothing` if it is given NaN, or positive or
59+negative infinity.
60+
61+```
62+> fromNumber (1.0 / 0.0) :: Maybe (Fixed P100)
63+Nothing
5464```
5565
5666#### `toNumber`
@@ -62,6 +72,73 @@ toNumber :: forall precision. KnownPrecision precision => Fixed precision -> Num
6272Convert a `Fixed` value to a `Number`.
6373
6474_Note_: Overflow is possible here if the numerator is sufficiently large.
75+Consider using `toString` instead.
76+
77+#### `fromString`
78+
79+``` purescript
80+fromString :: forall precision. KnownPrecision precision => String -> Maybe (Fixed precision)
81+```
82+
83+Parse a fixed-precision number from a string. Any decimal digits which are
84+not representable in the specified precision will be ignored.
85+
86+```
87+> fromString "123.456" :: Maybe (Fixed P1000)
88+(Just (fromString "123.456" :: P1000))
89+```
90+
91+Where possible, this function should be preferred over `fromNumber`, since
92+it is exact (whereas `fromNumber` can only provide an approximation for
93+larger inputs).
94+
95+```
96+> fromString "9007199254740992.5" :: Maybe (Fixed P10)
97+(Just (fromString "9007199254740992.5" :: P10))
98+
99+> fromNumber 9007199254740992.5 :: Maybe (Fixed P10)
100+(Just (fromString "9007199254740992.0" :: P10))
101+```
102+
103+
104+#### `toString`
105+
106+``` purescript
107+toString :: forall precision. KnownPrecision precision => Fixed precision -> String
108+```
109+
110+Represent a `Fixed` value as a string, using all of the decimal places it
111+can represent (based on its precision).
112+
113+```
114+> map toString (fromString "100.5" :: Maybe (Fixed P10))
115+(Just "100.5")
116+
117+> map toString (fromString "100.5" :: Maybe (Fixed P100))
118+(Just "100.50")
119+```
120+
121+#### `toStringWithPrecision`
122+
123+``` purescript
124+toStringWithPrecision :: forall precision. KnownPrecision precision => Int -> Fixed precision -> String
125+```
126+
127+Represent a `Fixed` value as a string, with the given number of decimal
128+places.
129+
130+```
131+> map (toStringWithPrecision 2) (fromString "1234.567" :: Maybe (Fixed P1000))
132+(Just "1234.56")
133+```
134+
135+If more decimal places are asked for than the type can provide, the extra
136+decimal places will be provided as zeroes.
137+
138+```
139+> map (toStringWithPrecision 3) (fromString "1234.5" :: Maybe (Fixed P10))
140+(Just "1234.500")
141+```
65142
66143#### `numerator`
67144
@@ -72,11 +149,11 @@ numerator :: forall precision. Fixed precision -> BigInt
72149Extract the numerator from the representation of the number as a fraction.
73150
74151```
75−> numerator (fromNumber 0.1234 :: Fixed P1000)
76−fromString "123"
152+> map numerator (fromNumber 0.1234 :: Fixed P1000)
153+(Just fromString "123")
77154
78−> numerator (fromNumber 0.1239 :: Fixed P1000)
79−fromString "123"
155+> map numerator (fromNumber 0.1239 :: Fixed P1000)
156+(Just fromString "123")
80157```
81158
82159#### `floor`
@@ -89,14 +166,14 @@ Calculate the largest whole number smaller than or equal to the provided
89166value.
90167
91168```
92−> floor $ fromNumber 0.1 :: Fixed P10
93−fromNumber 0.0 :: P10
169+> map floor $ fromNumber 0.1 :: Maybe (Fixed P10)
170+(Just (fromNumber 0.0 :: P10))
94171
95−> floor $ fromNumber 1.0 :: Fixed P10
96−fromNumber 1.0 :: P10
172+> map floor $ fromNumber 1.0 :: Maybe (Fixed P10)
173+(Just (fromNumber 1.0 :: P10))
97174
98−> floor $ fromNumber (-0.1) :: Fixed P10
99−fromNumber (-1.0) :: P10
175+> floor $ fromNumber (-0.1) :: Maybe (Fixed P10)
176+(Just (fromNumber (-1.0) :: P10))
100177```
101178
102179#### `ceil`
@@ -109,14 +186,14 @@ Calculate the smallest whole number greater than or equal to the provided
109186value.
110187
111188```
112−> ceil $ fromNumber 0.1 :: Fixed P10
113−fromNumber 1.0 :: P10
189+> map ceil $ fromNumber 0.1 :: Maybe (Fixed P10)
190+(Just (fromNumber 1.0 :: P10))
114191
115−> ceil $ fromNumber 1.0 :: Fixed P10
116−fromNumber 1.0 :: P10
192+> map ceil $ fromNumber 1.0 :: Maybe (Fixed P10)
193+(Just (fromNumber 1.0 :: P10))
117194
118−> ceil $ fromNumber (-0.1) :: Fixed P10
119−fromNumber 0.0 :: P10
195+> map ceil $ fromNumber (-0.1) :: Maybe (Fixed P10)
196+(Just (fromNumber 0.0 :: P10))
120197```
121198
122199#### `round`
@@ -128,17 +205,17 @@ round :: forall precision. KnownPrecision precision => Fixed precision -> Fixed
128205Round the specified value to the nearest whole number.
129206
130207```
131−> round $ fromNumber 0.1 :: Fixed P10
132−fromNumber 0.0 :: P10
208+> map round $ fromNumber 0.1 :: Maybe (Fixed P10)
209+(Just (fromNumber 0.0 :: P10))
133210
134−> round $ fromNumber 0.9 :: Fixed P10
135−fromNumber 1.0 :: P10
211+> map round $ fromNumber 0.9 :: Maybe (Fixed P10)
212+(Just (fromNumber 1.0 :: P10))
136213
137−> round $ fromNumber 0.5 :: Fixed P10
138−fromNumber 1.0 :: P10
214+> map round $ fromNumber 0.5 :: Maybe (Fixed P10)
215+(Just (fromNumber 1.0 :: P10))
139216
140−> round $ fromNumber (-0.1) :: Fixed P10
141−fromNumber 0.0 :: P10
217+> map round $ fromNumber (-0.1) :: Maybe (Fixed P10)
218+(Just (fromNumber 0.0 :: P10))
142219```
143220
144221#### `approxDiv`
@@ -150,16 +227,16 @@ approxDiv :: forall precision. KnownPrecision precision => Fixed precision -> Fi
150227Approximate division of fixed-precision numbers.
151228
152229```
153−> fromNumber 22.0 `approxDiv` fromNumber 7.0 :: Fixed P100
154−fromNumber 3.14 :: P100
230+> lift2 approxDiv (fromNumber 22.0) (fromNumber 7.0) :: Maybe (Fixed P100)
231+(Just (fromNumber 3.14 :: P100))
155232```
156233
157234_Note_: `Fixed` is not a `EuclideanRing` in general - it is not even
158235an integral domain, since it has non-zero zero-divisors:
159236
160237```
161−> fromNumber 0.1 * fromNumber 0.1 :: Fixed P10
162−fromNumber 0.0 :: P10
238+> lift2 (*) (fromNumber 0.1) (fromNumber 0.1) :: Maybe (Fixed P10)
239+(Just (fromNumber 0.0 :: P10))
163240```
164241
165242#### `Precision`
@@ -272,12 +349,31 @@ value at runtime, given a `PProxy`.
272349`reflectPrecision` returns a multiple of ten, corresponding
273350to the maximum number of decimal places which can be stored.
274351
352+```
353+> reflectPrecision (PProxy :: PProxy P1000)
354+1000
355+```
356+
275357##### Instances
276358``` purescript
277359KnownPrecision One
278360(KnownPrecision p) => KnownPrecision (TenTimes p)
279361```
280362
363+#### `reflectPrecisionDecimalPlaces`
364+
365+``` purescript
366+reflectPrecisionDecimalPlaces :: forall precision. KnownPrecision precision => PProxy precision -> Int
367+```
368+
369+Get the number of decimal places associated with a given `Precision` at
370+the value level.
371+
372+```
373+> reflectPrecisionDecimalPlaces (PProxy :: PProxy P1000)
374+3
375+```
376+
281377#### `reifyPrecision`
282378
283379``` purescript