Exact arithmetic and floating point
The fraction calculator avoids decimal arithmetic entirely. Each
side is parsed into a whole-number numerator and denominator, so
an entered 0.1 becomes 1/10 and adding 0.2 gives
exactly 3/10, where decimal arithmetic in a browser returns
0.30000000000000004. Arbitrary-precision integers do the work, the
answer is reduced by its greatest common divisor, and the decimal
beside it is that exact value rounded by integer division.
Everything else uses JavaScript's double-precision numbers, so a long decimal tail in a scientific result is the arithmetic rather than a fault. What never reaches the screen is a non-finite value: overflow is intercepted and replaced by Result is too large. Please use smaller values.
Rounding and display
Rounding happens once, at the point of display:
| Result | Shown as |
|---|---|
| Percentage of a total; percentage change | Two decimals |
| Square root; kilometres to miles | Six decimals |
| Area | Four decimals, labelled unit² |
| Fractions | Reduced fraction and six decimals |
| Kilograms and pounds | Two decimals |
| BMI | One decimal; the category from the unrounded value |
| Loan instalment | Two decimals, with totals |
| Return on investment | Two decimals; money in US dollars |
The BMI row has a consequence: because the boundaries apply to the unrounded figure, a displayed 25.0 can still read "Normal weight" if the true value was 24.96.
Validation and error messages
Every value is checked before any arithmetic runs. Blank fields and anything that is not a finite number are rejected, and the accepted ranges are those written into the code: a password length is a whole number from 4 to 30, a fraction up to 200 characters, text to summarise up to 100,000, a loan term a whole number of months, a factorial no larger than 170.
Messages name the fix rather than the failure — Square root requires a non-negative number, Tangent is undefined at 90° + multiples of 180°. A rejected input also clears the previous result.
Dates and the month-end rule
Dates are handled as a UTC calendar, never by dividing a difference in milliseconds, so your local offset and daylight saving cannot shift a result by a day. A date must survive a round trip, which is why 2025-02-29 is refused.
Age counts whole calendar months first, then the remaining days. Where a month is too short for the day of birth, the anniversary clamps to that month's last day: from 2000-01-31 to 2026-03-01 the answer is 26 years, 1 month and 1 day, because the February anniversary lands on 28 February. Someone born on 2024-02-29 turns one on 2025-02-28.
Time zones
The time zone converter keeps no offset table. It asks the browser what the wall-clock time in a named zone is for a given instant, then finds the instant whose wall time matches what you typed. Offsets and daylight-saving rules therefore come from the IANA time zone database shipped with your browser.
That search can find no match, or two: in New York, 02:30 on 8 March 2026 does not exist and 01:30 on 1 November 2026 happens twice. Rather than quietly pick one, the tool says which case it hit.
Random numbers and local file handling
Passwords are drawn from the browser's cryptographic generator,
crypto.getRandomValues, not Math.random.
Rejection sampling discards raw values above the largest exact
multiple of the range, so no character is more likely than
another. One character comes from each of upper case, lower case,
digits and symbols, and the string is then shuffled.
File tools work in the page. Image compression redraws your picture on a canvas and re-encodes it; DOCX conversion unzips the file in memory, reads its paragraph text and assembles the PDF byte by byte. The browser reads the file and writes the download, so nothing is uploaded. JPG and WebP re-encoding is lossy, and DOCX extraction keeps paragraph text only.
How changes are tested
Shared arithmetic lives in a few small modules rather than being
copied into each page, and a unit test suite asserts exact values
for them: a negative numerator, a 180-digit fraction, a zero
denominator, a zero-interest loan, 171 factorial, BMI on a
boundary, a leap-day birthday and both daylight-saving edge cases.
Browser tests then drive the real pages at 1280 and 390 pixels
wide, confirming that an invalid entry never shows
NaN or Infinity and that no page scrolls
sideways. Both suites run before a change goes live.
Sources
Adult BMI categories follow the ranges published by the World Health Organization and the United States Centers for Disease Control and Prevention: below 18.5, 18.5 to under 25, 25 to under 30, and 30 or above. They describe adults, not children or pregnancy. Conversion factors are fixed constants — one kilogram is 2.20462 pounds, one kilometre is 0.621371 miles — and time zone data comes from your browser. No page here reads a live feed.
Reporting an error
Email freetoolspoint@gmail.com with the page address, the exact values you entered, the result you saw and the result you expected, plus your reasoning or a source. Please leave private documents out of it.
The first step is to reproduce it. When it reproduces, either the calculation or the explanation is wrong; the one at fault is corrected, a test that would have caught it is added, and the review date on that page changes. When it does not, you get a reply asking for the browser and the exact inputs. Replies come from one person, so they are not immediate.
Reviewed October 1, 2026. About this site · Contact.
