Dilution factor calculator
Turn two volumes into a dilution factor and the share of stock left in the mix: 1 mL of solute in a 10 mL total is a tenfold dilution with a solute fraction of 0.1, written 1:9 or 1:10 depending on the convention. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Volume of solute
- 1
- Total volume
- 10
- Solvent volume
- 9
- Dilution factor
- 10
- Fold dilution
- 10
- Volume fraction solute
- 0.1
A dilution factor tells you how many times more dilute a final solution is compared with the aliquot you transferred. In the laboratory this is almost always the ratio of final total volume to solute (stock) volume, written DF equals V total over V solute, and reported as an N-fold dilution when the same number is used in protocol language. This capability takes those two volumes in matching units, returns the dilution factor, fold dilution, diluent volume, solute volume fraction, and classical one-to-N ratio strings, and rejects zero or negative solute volume with a clear invalid input error so scripts never divide by zero.
Volumes, dilution factor, and fold dilution explained
Start from a measured aliquot of stock solution with volume V solute and bring it to a final total volume V total by adding diluent such as water, buffer, or solvent. The dilution factor is defined as DF equals V total divided by V solute. When DF is ten, the preparation is a tenfold dilution: every unit of solute volume sits in ten units of total mixture, so the concentration of the analyte scales down by the same factor when volumes are ideal and no loss occurs.
Solvent volume is simply V total minus V solute, which is the amount of diluent you must add if you pipetted the aliquot into a volumetric flask or tube and filled to the mark. Units never appear in the arithmetic: microliters, milliliters, and liters all work as long as both inputs share the same unit system.
Lab workflows and related tools
Call the free in-browser dilution factor from volumes calculator when teaching serial dilutions, checking a protocol that only states aliquot and final flask size, or converting a handwritten one-to-ten note into DF and fold language without opening a spreadsheet. Serial dilution chains can call the capability once per step and multiply successive dilution factors to obtain the overall fold from stock to last tube.
Source inputs follow the same retention rules as other KIT parse items, and results are safe to pin in automated tests because the algorithm is fully deterministic.
What you can do with it
Bench protocol and notebook checks
Technicians enter aliquot and final flask volumes to confirm DF and fold dilution match the written SOP before filling to the mark.
Teaching serial dilutions
Instructors and students convert one-to-ten and one-to-hundred steps into explicit dilution factors and diluent volumes for lab reports.
FAQ
How is dilution factor calculated from volumes?
Fold dilution uses the same number (for example DF 10 is a 10-fold dilution). Solvent volume is total minus solute.
What happens if solute volume is zero or negative?
Zero solute makes DF undefined (division by zero); negative volumes are rejected as invalid and are not charged.
Do the two volumes need the same units?
Yes. Use matching units for both fields (both mL, both µL, both L, and so on). The calculator is unit-agnostic and does not convert between unit systems.
Is the dilution factor calculator free?
The browser tool runs free on your device.
How is this different from the M1V1=M2V2 dilution calculator?
This capability only needs two volumes and returns DF and fold dilution. The M1V1=M2V2 tool solves for a missing concentration or volume when three of the four equation terms are known.
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/chem/dilution-factor-from-volumes \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"solute_volume":1,"total_volume":10}'const res = await fetch("https://api.kit.forhosting.com/chem/dilution-factor-from-volumes", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"solute_volume": 1,
"total_volume": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/chem/dilution-factor-from-volumes",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"solute_volume": 1,
"total_volume": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/chem/dilution-factor-from-volumes", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"solute_volume":1,"total_volume":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"solute_volume":1,"total_volume":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/chem/dilution-factor-from-volumes", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"solute_volume": 1,
"total_volume": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "chem.dilution_factor_from_volumes",
"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
Volumes, dilution factor, and fold dilution explained
Fold dilution is reported as the same numeric value so notebooks that say prepare a fiftyfold dilution of the stock can pin fold_dilution equals fifty without inventing a second convention. Volume fraction of solute equals V solute over V total and is the reciprocal of the dilution factor; concentration_ratio echoes that fraction for pipelines that prefer a relative remaining concentration label. Ratio strings follow common bench phrasing: ratio_solute_to_total is one colon DF, while ratio_solute_to_solvent is one colon the diluent multiples, for example one to nine when one part stock is mixed with nine parts solvent to make a tenfold total dilution. Identical inputs always yield identical JSON because the path is pure arithmetic with no network calls, no random seed, and no wall clock.
Input fields, validation rules, and reading the JSON response
Total volume must be positive and greater than or equal to the solute volume so the engine never invents a concentrating step under a dilution label. Send a JSON object with required solute_volume and total_volume as finite numbers or numeric strings. Aliases such as aliquot, aliquot_volume, v_solute, and v1 map to the stock aliquot; final_volume, v_total, and v2 map to the finished mixture volume. Solute volume must be strictly positive: zero is invalid_input because dilution factor is undefined when the aliquot vanishes, and negative volumes are rejected as physically meaningless. On success the response echoes the rounded inputs, solvent_volume, dilution_factor, fold_dilution, volume_fraction_solute, concentration_ratio, both ratio strings, formula set to DF equals V_total slash V_solute, and method always dilution_factor_from_volumes for stable branching. Missing fields, non-finite values, zero solute, negative solute, non-positive total, and total smaller than solute all fail with invalid_input and are not charged after the engine rejects the request. Prefer classroom and bench-scale volumes; the math itself has no artificial upper cap beyond ordinary IEEE double range, but absurdly large exponents still deserve human review before they enter a regulated notebook.
API usage, pricing, lab workflows, and related tools
Use the prepaid API when a laboratory information system, curriculum generator, media-prep app, or quality-control script needs a stable contract under KIT balance at $0.002 per successful item. Pair this endpoint with the M1V1 equals M2V2 dilution solver when you already know concentrations and must find a missing volume or molarity, and with the dilution-to-target-ppm calculator when the goal is a mass-based target rather than a pure volume ratio. Authors shipping SDKs can map dilution_factor and fold_dilution into UI badges, solvent_volume into a fill-to-mark helper, and ratio strings into printable labels for bottles and tubes—the same numbers students write when they compute DF by hand at the bench.
Integration use cases
LIMS and media-prep automation
Pipelines that only store solute and total volumes call a stable prepaid endpoint to attach DF, fold, and ratio strings to batch records.