Tip Calculator JavaScript Example
Build a tip calculator in JavaScript with labeled number inputs, explicit conversion, validation, bill splitting, fixed-decimal display, and an accessible live result.
Written and checked by TheToolNet Editorial Team · Last reviewed: September 27, 2026 · Editorial method
Try the JavaScript calculator
Complete HTML
<form id="tip-form"> <label>Bill <input id="bill" type="number" min="0.01" step="0.01" required></label> <label>Tip % <input id="rate" type="number" min="0" step="0.1" required></label> <label>People <input id="people" type="number" min="1" step="1" value="1" required></label> <button>Calculate</button> </form> <output id="result" aria-live="polite"></output>JavaScript with validation
const form = document.querySelector('#tip-form'); const result = document.querySelector('#result'); form.addEventListener('submit', (event) => { event.preventDefault(); const bill = Number(document.querySelector('#bill').value); const rate = Number(document.querySelector('#rate').value); const people = Number(document.querySelector('#people').value); if (!Number.isFinite(bill) || bill <= 0 || !Number.isFinite(rate) || rate < 0 || !Number.isInteger(people) || people < 1) { result.textContent = 'Check the inputs.'; return; } const tip = bill * rate / 100; const total = bill + tip; result.textContent = `Tip: ${tip.toFixed(2)} | Total: ${total.toFixed(2)} | Each: ${(total / people).toFixed(2)}`; });Why explicit number conversion matters
Input values are strings. Addition can concatenate strings, so convert with Number() before arithmetic. Number.isFinite() rejects missing or invalid conversions, while Number.isInteger() keeps the people count whole.
Rounding and money
toFixed(2) is appropriate for display, but JavaScript numbers use binary floating point. For payments or accounting records, calculate in integer minor units or use a carefully tested decimal-money library. This example is a client-side learning project, not a payment system.
Accessible behavior
Labels connect inputs to their purpose, the submit event works with mouse or keyboard, and aria-live="polite" announces the updated result. The explanatory content remains available without JavaScript.
Next step
Add optional tax and service-charge inputs only after defining which amount forms the tip base. The working percentage to tip calculator demonstrates that distinction.