numbers.js

Practical uses

Correcting rounding errors and number formatting for shopping cart programs

Version requirement

JavaScript 1.1

Functions

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.

Better looking numbers, thanks to JavaScript

Figure 6-14. Better looking numbers, thanks to JavaScript

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.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.141.29.145