PPM percent converter
1000 ppm is 0.1 %, 1 % is ten thousand ppm and 1 ppm is 1000 ppb. Enter one concentration and see it at once in ppm, ppb, percent and per-mille, so labels, lab sheets and compliance forms all show the same fraction. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Concentration magnitude to convert
- 1,000
- Input concentration unit
- ppm
- Output concentration unit
- percent
- Result
- 0.1
- Ppm
- 1,000
- Ppb
- 1,000,000
- Percent
- 0.1
Relative concentration scales are everyday language in water quality, air monitoring, metallurgy, brewing, and clinical labs, yet the same physical fraction is written as parts per million, parts per billion, percent, or per-mille depending on the audience and the magnitude. One thousand parts per million is exactly one tenth of a percent; one percent is ten thousand ppm; one part per billion is one thousandth of a ppm. This converter takes a single finite number and a from-unit, scales it through a pure dimensionless fraction with exact powers of ten, and returns the same concentration in ppm, ppb, percent, and per-mille plus the pure fraction so spreadsheets, labels, and regulatory forms stay consistent. Unknown unit labels fail with a clear validation error instead of a silent wrong scale.
How relative concentration units relate through a pure fraction
A pure relative concentration is a dimensionless fraction: the amount of substance of interest divided by the total amount of the same kind (mass over mass, volume over volume, or mole over mole when the basis is stated). Parts per million multiplies that fraction by one million, so one ppm equals one part in one million or a fraction of one times ten to the minus six. Parts per billion multiplies by one billion, so one ppb equals one times ten to the minus nine.
Percent multiplies by one hundred, so one percent equals one times ten to the minus two. Per-mille multiplies by one thousand, so one per-mille equals one times ten to the minus three and is written with the per-mille sign in many European standards. Because every scale is a constant multiple of the same fraction, conversion is exact arithmetic: divide the input value by the factor of the source unit to recover the fraction, then multiply by the factor of the target unit.
Classic checks include one thousand ppm equals zero point one percent, one percent equals ten thousand ppm, one per-mille equals one thousand ppm, and one ppm equals one thousand ppb. The converter never invents a density or a molecular weight; if you need absolute mass per volume from a solute mass and a solution volume, use a mass-based ppm calculator instead.
Where ppm, percent, and per-mille conversion shows up in real work
Environmental labs report dissolved metals and disinfection by-products in ppm or ppb while municipal reports often quote the same figures as milligrams per litre or as a percent of a regulatory limit; converting the relative scale without changing the physical basis keeps dashboards honest when the limit is stated in another unit.
Food, beverage, and brewing quality systems move between percent alcohol by volume, residual sugar in per-mille, and additive levels in ppm, and a single bridge prevents transcription errors when a specification sheet uses European per-mille and a supplier uses parts per million. Metallurgy and materials certificates list impurity limits in ppm while process control screens show percent composition for major elements, so engineers need a shared table that always returns every scale.
Clinical and veterinary panels sometimes mix percent saturation with ppm dissolved gas conventions depending on the instrument firmware; translating without double-scaling is safer than mental arithmetic under time pressure. If you later need to compute ppm from solute mass and solution mass or volume, treat that mass-based calculator as a separate search intent and landing rather than overloading this unit converter page.
What you can do with it
Water and air quality reports
Convert sensor and lab values among ppm, ppb, and percent so dashboards match regulatory wording without re-running the assay.
Food, beverage, and process specs
Translate additive and impurity limits between per-mille European forms and parts-per-million supplier sheets in one call.
Materials and impurity certificates
Map major-element percent composition tables to ppm impurity columns for the same alloy heat or batch record.
FAQ
Which concentration units does this converter support?
Four relative scales: parts per million (ppm), parts per billion (ppb), percent (%), and per-mille (‰ / parts per thousand).
How do you convert ppm to percent?
Divide ppm by 10_000 (or scale through the pure fraction: fraction = ppm × 1e-6, percent = fraction × 100).
Is this the same as calculating ppm from solute mass?
No. This page only converts between relative units. Computing ppm from solute mass and solution mass or volume is a different tool (mass-based ppm calculator).
What does it cost?
The browser tool is free and runs locally.
How do I convert ppb to ppm?
Divide by 1000, because one part per billion is one thousandth of a part per million. Enter the value in ppb and the converter also shows it in percent and per-mille at the same time.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/conv/ppm \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"value":1000,"from":"ppm","to":"percent"}'const res = await fetch("https://api.kit.forhosting.com/conv/ppm", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"value": 1000,
"from": "ppm",
"to": "percent"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/conv/ppm",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"value": 1000,
"from": "ppm",
"to": "percent"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/conv/ppm", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"value":1000,"from":"ppm","to":"percent"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"value":1000,"from":"ppm","to":"percent"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/conv/ppm", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"value": 1000,
"from": "ppm",
"to": "percent"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "conv.ppm",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
How relative concentration units relate through a pure fraction
All arithmetic is deterministic floating-point with no network, no randomness, and no wall-clock timestamps, so identical inputs always produce identical JSON. Non-finite numbers and blank fields are rejected with invalid_input before any scale is applied.
What you send and what you get back
Send three fields: value as a finite number, from as the input unit, and to as the output unit. Matching is case-insensitive and tolerates hyphens and spaces. Wire the free browser form for one-off label checks, then call the identical contract from scripts when you need bulk conversion of sensor logs or product specs. Accepted labels include ppm, parts per million, and common laboratory aliases such as mg per kg for dilute aqueous mass fractions; ppb and parts per billion; percent, percentage, pct, and the percent sign; and per_mille, permille, per-mille, parts per thousand, ppt as parts per thousand, and the per-mille sign. On success the response echoes the cleaned value, the normalized from and to keys, the primary result in the target unit, the same concentration in all four units, the pure dimensionless fraction, the exact factors used, a short formula string, and method set to fraction_bridge. A typical call with value one thousand, from ppm, and to percent returns result zero point one, percent zero point one, ppm one thousand, ppb one million, and per_mille one. Unrecognized units fail with invalid_input and a message that names the bad label and lists the four accepted families; missing value, NaN, and Infinity fail the same way and are not charged. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where ppm, percent, and per-mille conversion shows up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Technical questions
What happens if I send an unknown unit?
The request fails with invalid_input. The error message includes Unrecognized unit and lists the accepted families (ppm, ppb, percent, per_mille).