# Re: Division in Smalltalk

• To: LRG^ at PARC-MAXC, Goldstein at PARC-MAXC, Bobrow at PARC-MAXC
• Subject: Re: Division in Smalltalk
• From: Deutsch at PARC-MAXC
• Date: Wed ,31 Dec 80 15:52:00 EDT
• Cc: LISP-FORUM at MIT-MC

```Well, it looks like we've finally come to a decision about the
division and remainder (modulus) operators in Smalltalk-80, so here it
is for everyone to start getting used to it.

/	means "correct division".  If you divide two integers and the
remainder wouldn't be zero, / returns a Fraction (rational
representation in lowest terms).  If you divide two exact numbers
(integers or Fractions), the result loses no information: it is a
Fraction if (and only if) the quotient isn't integral. If you do a
division involving an inexact number (Float), the result is always a
Float.

//	means "division with truncation towards minus infinity".  The
result is always an integer, regardless of what you started with.  a
// b is equivalent to (a / b) floor.

\\	means "remainder with truncation towards minus infinity".  a
\\ b is equivalent to a - ((a // b) * b).  This operation is sometimes
called "modulus": it is, for example, an appropriate operation for
reducing hash values modulo a table size.

quo:	means "division with truncation towards zero".  The result is
always an integer.  a quo: b is equivalent to (a / b) truncate.

rem:	means "remainder with truncation towards zero", i.e. a rem: b is
equivalent to a - ((a quo: b) * b).

This arrangement was worked out in a long and often frustrating
process that involved input from a lot of people.  Steve Putz is
busily implementing it at this very moment.
```