Formatting numbers to a consistent number of decimal places is often necessary in web development, especially when working with currencies, percentages, or other numeric data that benefits from standardized precision.
In JavaScript, there are a couple easy methods to format a number to always show two decimal places. The toFixed()
and toLocaleString()
methods provide simple ways to handle decimal rounding and string formatting without extensive coding.
In this comprehensive guide, we’ll explore these methods for enforcing two decimal places in JavaScript numbers. We’ll cover:
- Use cases showing when two decimal precision is helpful
- A breakdown of the
toFixed()
method and examples - How to leverage
toLocaleString()
for number formatting - Localization support with
toLocaleString()
- Comparison of key differences in the methods
- Common formatting gotchas to avoid
Understanding these JavaScript number formatting approaches will equip you to handle rounding, precision, and readability for numbers in your web projects.
When to Format Numbers to Two Decimal Places
Showing two decimal places can improve consistency, precision, and readability for certain types of numeric data:
Currencies: When presenting monetary values, two decimals places properly represent cents/pence denominations in dollars, euros, pounds sterling, etc.
Percentages: Calculating percentages often involves decimal values. Showing two decimal places avoids confusion from rounding and enhances precision.
Weights and Measures: Systems like metric (grams, kilos, meters) and imperial (ounces, pounds, feet) often utilize two decimals even when fractional units are not involved.
General Readability: Numbers with long unrounded decimal values can be difficult to parse. Cutting down to two decimal places improves skimmability.
So in short, sticking to two decimal places aligns with conventions for various data types, prevents awkward long decimal numbers, and improves comprehension.
Next let’s look at how to implement two decimal rounding in JavaScript.
Using JavaScript’s toFixed() Method
The easiest way to format a number to always show two decimal places in JavaScript is with the toFixed()
method.
toFixed() Overview
The toFixed()
method is available on all JavaScript numbers (the Number prototype).
Calling .toFixed()
on a number rounds the number to a specified number of decimals then returns the number as a string.
Here is the syntax:
num.toFixed(digits)
The digits
parameter is the number of decimals to round to. So for two decimal places, we pass 2.
For example:
let num = 1.234567
num.toFixed(2) // Returns ‘1.23‘
Key things to note about toFixed()
:
- Rounds the number to the given number of decimals
- Returns a string, not a number type
- Useful for persisting a number to a certain precision without actually losing precision (since the original number value is untouched)
Next let’s look at some more robust examples of using toFixed()
for enforcing two decimal place formatting.
toFixed() Examples
toFixed(2)
makes an easy one-liner for displaying numbers with two decimals:
let price = 1.234 // = $1.23
price.toFixed(2) // "1.23"
let temp = 22.45456 // = 22.45 degrees
temp.toFixed(2) // "22.45"
To use the returned string value, you can insert it into DOM elements:
let fees = 1.5748
document.getElementById("fee").innerText = fees.toFixed(2)
// Inserts text "1.57" into DOM element
Or assign formatting to a variable:
let salesTaxPercent = 7.325
let taxString = salesTaxPercent.toFixed(2) // = "7.33"
document.getElementById("tax").innerText = taxString
One thing to note with toFixed()
is that since it returns a string, if you want to use the value in further calculations, you’ll need to convert it back to a number using the Number()
function:
let price = 10.895
let stringPrice = price.toFixed(2) // = "10.90"
let total = Number(stringPrice) * 1.08 // Calculate total with tax
This parses the string back into a number that can be used mathematically.
toFixed() Gotchas
While toFixed()
provides an easy method for decimal rounding, there are couple edge cases to keep in mind:
Limited Rounding Precision
toFixed()
only supports rounding to a max of 20 digits after the decimal:
let num = 23.4792817391872971
num.toFixed(3) // Rounds fine - "23.479"
num.toFixed(30) // FAILS - only supports 20 decimals
So for full control beyond 20 decimals, different methods would be needed.
Rounding Errors
The internal rounding algorithm can sometimes introduce tiny errors from precision loss.
For example:
let x = 1.005 * 100 // = 100.49999999999999
let y = x.toFixed(2) // Rounds up to "100.50"
This tiny rounding up should be negligible in most cases but worth being aware of.
Overall though, used properly toFixed()
provides an easy route to standard two decimal precision.
Leveraging JavaScript’s toLocaleString()
An alternative method for formatting numbers to a certain number of decimals is toLocaleString()
.
toLocaleString() Overview
The toLocaleString()
method is also available on all JavaScript numbers. When called on a number it:
- Converts the number to a string, localized to the host environment’s locale and language
- Allows specifying options like minimum/maximum fraction digits to control decimal precision
Here is the basic syntax:
num.toLocaleString(locale, options)
The method takes two optional parameters:
locale
– the locale to format the string towardsoptions
– object with formatting options like decimal precision
To simply format a number to two decimals, we can ignore locales and specify minimumFractionDigits
and maximumFractionDigits
like:
let num = 542.4315
num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})
// Returns "542.43"
This handles truncating the number to two decimals for us.
Next let’s walk through some more examples using toLocaleString()
for rounding decimals.
toLocaleString() Examples
Similarly to toFixed()
, toLocaleString()
can be used as quick one-liner:
let temp = 22.43222
temp.toLocaleString(undefined, {maximumFractionDigits: 2})
// Returns "22.43"
We can also use the returned string values by inserting them into the DOM:
let price = 19.99
let tax = 0.875
let total = price + tax
document.getElementById("total").innerText = total.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2
})
// Inserts text "20.87" into DOM element
Or by assigning to string variables:
let padding = 2.33333
let padString = padding.toLocaleString(undefined, {maximumFractionDigits: 2})
// padString = "2.33"
For math operations, remember strings will again need conversion:
let sales = 100.75
let salesString = sales.toLocaleString(undefined, {maximumFractionDigits: 2})
let fees = Number(salesString) * 0.0335 // Convert back to number
Localization Support
One extra advantage of toLocaleString()
is it provides localization support for free.
We can specify a locale to automatically format the number string per that locale and language:
let price = 542.351
// German locale and decimals
price.toLocaleString(‘de-DE‘, {maximumFractionDigits: 2})
// Returns "542,35" with commas for decimals
You can lookup valid locale tags, but common ones include:
- en-US – English (United States)
- en-GB – English (Britain)
- fr-FR – French
- zh-CN – Chinese
- etc.
This makes translating decimal formats much easier across languages.
toLocaleString() Gotchas
Similar to toFixed()
be aware that toLocaleString()
:
- Returns string values that may need parsing for math ops
- Has limited rounding precision (~20 digits max)
- Could introduce tiny rounding errors
So these precision tradeoffs are worth keeping in mind for mission critical calculations.
toFixed() vs toLocaleString() Comparison
Now that we’ve covered toFixed()
and toLocaleString()
in detail, let’s recap some key differences between the methods:
Feature | toFixed() | toLocaleString() |
---|---|---|
Supported parameters | Digits only | Locale + options object |
Localization | ❌ | ✅ |
Output value | String | String |
Rounding | Built-in algorithm | Truncate specified digits |
Ease of use | Slightly easier | Little more verbose |
So in summary:
toFixed()
is simpler with only digit roundingtoLocaleString()
handles locales but needs more options- Both output strings so numbers may need re-parsing
- Either achieves standard two decimal formatting
Choosing between them depends if you need localization or fine-grained control over rounding rules.
Avoiding Common Number Format Pitfalls
While toFixed()
and toLocaleString()
abstract away much of the complexity around decimal formatting, there are still a couple easy mistakes to make. Be aware of:
Mixing Data Contexts
Don’t display currency and percentages using the same decimal precision:
// Confusing - are percentages or dollars!?
Sale: $6.50
Discount: 20.00%
Stick to currency conventions like $6.50
and percentage conventions like 20.00%
.
Hard-coded Precision
Avoid littering your code with hard-coded decimals:
// Hard to maintain
let taxRate = 0.0625
let discount = 0.10
// etc.
Instead, calculate then standardize precision:
let taxRate = 6.25 / 100
let formattedTax = taxRate.toFixed(2) // "0.06"
let discount = 10 / 100
let formatDisc = discount.toFixed(2) // "0.10"
This keeps the original values changeable.
Putting into Practice
The key takeaways are:
- Use
toFixed(2)
ortoLocaleString()
to easily format decimals - Remember they return strings not numbers
- Be aware of precision limits and locale needs
- Avoid common decimal pitfalls
Applying these guidelines will properly handle rounding and formatting for currencies, percentages, metrics, and any numeric data requiring a consistent decimal display.
The techniques shown here provide a straightforward way to reinforce significant digits, improve readability, and standardize interfaces by formatting JavaScript numbers to always show two decimal places.
I hope this guide gives you a comprehensive overview of formatting decimal numbers in JavaScript! Let me know if you have any other questions.