Most software engineers are aware that floating point numbers are
not suitable
for monetary amounts, or any amount requiring reliable decimal precision.
It’s nice to have a quick and simple example of this, so here’s an operation
that will break with floating point numbers in many languages including
JavaScript:
1.01 - 0.42
// → 0.5900000000000001
In JavaScript and TypeScript, the big.js
library is good for decimal operations.
In SQL, it’s best to store monetary and other decimal amounts as DECIMAL , e.g.
DECIMAL(10,2) .
Note that there’s a common misconception that you shouldn’t use the number type
in JSON for decimal amounts, due to these precision errors. However, JSON
itself is just a string, so despite the JavaScript Number type being a
floating point implementation, it’s not accurate to describe JSON numbers as
being floating point. They’re just strings.
Floating point precision issues only occur when a decimal number is operated on
naively in JavaScript other languages. Sending a decimal representation over
the wire as {"fooNumber" 123.45} is fine so long as the receiver handles it
correctly.
View post:
Simple example of a floating point precision error for monetary amounts
|