# [racket] Decimal rounding problem

But why does 3.225 round differently than 4.225?
I see that this is different:
>* (> 3.225 #e3.225)
*#t
but I would have thought that the integer part wouldn't affect
anything here since floats have those parts separate? I thought?
Robby
On Thu, Nov 29, 2012 at 8:55 AM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
>* At Thu, 29 Nov 2012 14:44:38 +0000, Greg Graham wrote:
*>>* I am trying to report GPA calculation results to 2 decimal places, so I thought
*>>* real->decimal-string would do the trick. However, the following behavior
*>>* surprised me:
*>>*
*>>* > (real->decimal-string 3.225 2)
*>>* "3.23"
*>>* > (real->decimal-string 4.225 2)
*>>* "4.22"
*>>*
*>>* I would like the second answer to be "4.23", which is what a student would
*>>* expect to see if they did the calculations themselves. The documentation for
*>>* real->decimal-string says that it first converts the argument to an exact
*>>* number. I suspect the problem has something to do with this:
*>>*
*>>* > (inexact->exact 4.225)
*>>* 4 126663739519795/562949953421312
*>>* > (/ 126663739519795.0 562949953421312.0)
*>>* 0.22499999999999964
*>>*
*>>* Is there another rounding function that would just round the floating point
*>>* without going through the conversion to exact?
*>*
*>* There are a couple of issues here.
*>*
*>* First, the inexact number 4.225 is actually slightly smaller than the
*>* exact value 4.225:
*>*
*>* > (< 4.225 #e4.225)
*>* #t
*>* > (pretty-print-exact-as-decimal #t)
*>* > (inexact->exact 4.225)
*>* 4.2249999999999996447286321199499070644378662109375
*>*
*>* So, that's one reason to argue that "4.22" is the right answer.
*>*
*>*
*>* Even if you use the exact number 4.225, though, you get a "2" as the
*>* last digit:
*>*
*>* > (real->decimal-string #e4.225 2)
*>* "4.22"
*>*
*>* That's because rounding in Racket is to "even" --- a different
*>* convention than the one taught to most students, but one that it often
*>* preferred in computing (because it often reduces accumulated error, as I
*>* understand it).
*>*
*>* ____________________
*>* Racket Users list:
*>* http://lists.racket-lang.org/users
*