# Why decimal?

Brendan Eich brendan at mozilla.com
Tue Jun 23 10:20:41 PDT 2009

```On Jun 23, 2009, at 10:10 AM, Christian Plesner Hansen wrote:

>> Do you consider that naive user's calculator example to be
>> "financial"? I do
>> not.
>
> I don't know, the user doesn't say why this inaccuracy is a problem.
> It sounds like he's just generally unhappy that arithmetic is
> approximate.  Decimal is approximate too.

That's true at very extreme margins only! Decimal does not fail to
round power-of-five products so badly, and I think you know this.

13+ years ago, I got a bug report about this calculation:

js> 79.46-39.96
39.49999999999999

This was before we founded mozilla.org, it was about Netscape 2 or 3.
So the bug report prefigured bug 5856.

These dollars and cents calculations are quite common, and decimal
handles them correctly with full precision and no rounding errors.

>  Unless the example is set
> in a context where we know we'll stay in base 10, such as financial,
> decimal arithmetic will only give you less accuracy per bit.

Why are you talking about "bits" here?

Base 2 and base 5 are different, and finite precision in the latter
(or base 10) can represent numbers exactly, for which no exact
representation exists or can be rounded nicely using base 2 with any
finite precision.

> As far as I can see none of the reports collected under 5856 ask for
> decimal, what they ask for is accurate arithmetic.  Decimal doesn't
> provide that.  If people were asking for decimal arithmetic because
> they needed it for some particular financial or scientific application
> then that would be different.

See above. I think you are missing something fundamental about the
problem reported at that bug. Decimal does fix it for the use-cases
reported there and in dups.

> Are there any other uses planned for value types than decimal?

Sure: point, rational, complex, RGBA color, quaternion, .... Some of
these are esoteric, scientific programmers may care (game programmers
too). Others are pretty common on the web.

/be
```