Correcting rounding errors and number formatting for shopping cart programs
JavaScript 1.1
twoPlaces()
, round()
,
totals()
JavaScript performs floating point arithmetic a little differently than we might expect; the result is that many of our calculations also come out slightly different than what we expect. The DevEdge Newsgroup FAQ at http://developer1.netscape.com:80/support/faqs/champions/javascript.html#2-2 uses the example 0.119 * 100 = 11.899999. It’s also common to want to display number in terms of dollars and cents. The functions in numbers.js are designed to help with both situations. All three functions included are based on those at http://www.irt.org/script/number.htm maintained by Martin Webb. Figure 6.14 shows ch06 umbers.html loaded.
The numbers displayed under the “Two Decimal Places”
heading shows how function twoPlaces()
formats
numbers to place them in a dollars and cents format. The other two
headings display the difference between the expression 51.02 - 3.8
both without and with function round()
and
totals()
, the latter of which is the desired
effect. Example 6.9 shows
numbers.js.
Example 6-9. number.js
1 function twoPlaces(amount) { 2 return (amount == Math.floor(amount)) ? amount + '.00' : 3 ((amount*10 == Math.floor(amount*10)) ? amount + '0' : amount); 4 } 5 6 function round(number,X) { 7 X = (!X ? 2 : X); 8 return Math.round(number * Math.pow(10,X)) / Math.pow(10,X); 9 } 10
Function twoPlaces()
returns the string value of
the number it receives with either 0
or
.00
appended, or nothing if the number is already
correctly formatted. That huge conditional expression translates to
English as:
If the number is equal to its greatest lower integer
(Math.floor(amount)
), return it as a string with
.00
appended.
Otherwise, if the number times 10 equals its greatest lower integer
times 10 (Math.floor(amount) * 10
), return it as a
string with .0 appended.
Otherwise, return the number as a string, because it is fine the way it is.
As for the rounding errors listed below the “Two Decimal
Places” list, function round()
returns the
number received rounded to the precision of integer
x
decimal places. x
defaults to
2. Therefore, the default is rounding to two places if you
don’t pass in a value for x
.
3.141.29.145