Weighted score out of total
Homework 85/100, a midterm 16/20 and a final 42/50, weighted 30, 30 and 40, give a mark of 16.62 out of 20. Each category becomes a ratio of its own maximum, then the weighted result is scaled to the total you report on. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Out of
- 20
- Mark
- 16.62
- Mark display
- 16.62 / 20
- Weighted percent
- 83.1
- Weighted ratio
- 0.831
Course syllabi rarely use a single raw percentage.
Turning scores on different scales into one mark
Homework, labs, midterms and finals rarely share the same maximum, and each carries its own weight in the syllabus. The calculation first turns every category into a ratio: 85 out of 100 is 0.85, 16 out of 20 is 0.80 and 42 out of 50 is 0.84. Each ratio is multiplied by its weight, the products are added and the sum is divided by the total weight, which gives a weighted ratio of 0.831. Multiply that by the total you report on, 20 in this case, and the mark is 16.62 out of 20, the same as 83.1%.
When to use it and what to watch for
Use it whenever a programme reports on a fixed scale that is not zero to one hundred, such as the note sur 20 of French and many European secondary schools, a mark out of ten, or a combined score on one hundred. It also works mid-term: update the category scores as they arrive and recompute the running mark before the final is graded. Keep two things in mind. Each category needs its own points possible, so enter the maximum for that category rather than the course total. And the weights decide the pull of each category, so a final at weight 40 moves the mark more than homework at weight 30, even with a similar ratio.
What a weighted score out of a total means
A weighted score out of a total is the natural answer when the syllabus publishes category weights and a reporting scale that is not simply zero to one hundred. French and many European secondary contexts report a note sur 20; other programs use ten, four, or a custom ceiling. The three ratios are zero point eight five, zero point eight zero, and zero point eight four; the weight-average ratio is zero point eight three one; the mark is about sixteen point six two out of twenty.
That is not the same product question as a generic grade calculator that only returns a weighted percentage, nor as a statistical weighted mean of arbitrary values without a shared max and scale.
What you can do with it
Syllabus weight check mid-term
Update category scores as they arrive and recompute the running weighted mark on the published scale before the final is graded.
FAQ
Do category weights need to sum to 100?
No. Weights are relative; the engine divides by the sum of weights, so 30/30/40 and 0.3/0.3/0.4 produce the same mark for the same ratios.
Is this the same as a plain grade calculator or weighted mean?
No. Those tools return an average or percent.
How do I turn my weighted grade into a mark out of 20?
Set the total to 20. The weighted ratio of your categories is multiplied by that total, so a weighted ratio of 0.831 becomes 16.62 out of 20. Set 10 or 100 instead and the same ratio is scaled to that total.
Can each category have a different maximum score?
Yes. Every category is entered with its own points earned and points possible, and each one is turned into a ratio before weighting. A midterm of 16 out of 20 counts as 0.80 and a final of 42 out of 50 as 0.84.
How much does each category add to the final mark?
The breakdown shows it in mark points. In the example out of 20, homework adds 5.1, the midterm 4.8 and the final 6.72, which together make the mark of 16.62.
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/edu/weighted-score-out-of \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"categories":[{"label":"Homework","score":85,"max_score":100,"weight":30},{"label":"Midterm","score":16,"max_score":20,"weight":30},{"label":"Final","score":42,"max_score":50,"weight":40}],"out_of":20}'const res = await fetch("https://api.kit.forhosting.com/edu/weighted-score-out-of", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"categories": [
{
"label": "Homework",
"score": 85,
"max_score": 100,
"weight": 30
},
{
"label": "Midterm",
"score": 16,
"max_score": 20,
"weight": 30
},
{
"label": "Final",
"score": 42,
"max_score": 50,
"weight": 40
}
],
"out_of": 20
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/weighted-score-out-of",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"categories": [
{
"label": "Homework",
"score": 85,
"max_score": 100,
"weight": 30
},
{
"label": "Midterm",
"score": 16,
"max_score": 20,
"weight": 30
},
{
"label": "Final",
"score": 42,
"max_score": 50,
"weight": 40
}
],
"out_of": 20
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/weighted-score-out-of", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"categories":[{"label":"Homework","score":85,"max_score":100,"weight":30},{"label":"Midterm","score":16,"max_score":20,"weight":30},{"label":"Final","score":42,"max_score":50,"weight":40}],"out_of":20}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"categories":[{"label":"Homework","score":85,"max_score":100,"weight":30},{"label":"Midterm","score":16,"max_score":20,"weight":30},{"label":"Final","score":42,"max_score":50,"weight":40}],"out_of":20}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/weighted-score-out-of", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"categories": [
{
"label": "Homework",
"score": 85,
"max_score": 100,
"weight": 30
},
{
"label": "Midterm",
"score": 16,
"max_score": 20,
"weight": 30
},
{
"label": "Final",
"score": 42,
"max_score": 50,
"weight": 40
}
],
"out_of": 20
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.weighted_score_out_of",
"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
They mix homework, labs, midterms, and finals—each on its own max and each with a different weight—and students still need one number on the published scale: a grade out of twenty, a mark out of ten, or a combined score on one hundred. This calculator turns that weighted set of category scores into a single mark out of a total you choose. Enter every category with the points earned, points possible, and weight, then set out_of (for example 20 for a classic note sur 20). The engine normalizes each row to a ratio, takes the weight-average of those ratios, multiplies by your total, and returns mark, mark_display, and a per-category breakdown.
What a weighted score out of a total means
The math is the same everywhere: each category contributes score divided by max_score, that ratio is multiplied by the category weight, those products are summed, the sum is divided by the total weight, and the result is multiplied by out_of. Example: homework eighty-five of one hundred at weight thirty, midterm sixteen of twenty at weight thirty, final forty-two of fifty at weight forty, out_of twenty. People who search for weighted score out of total, grade out of 20, or category mark on a fixed scale want this conversion as the headline result, with a clear mark_display string they can paste into a report or parent message. Because every category is normalized by its own max_score, you can mix a quiz scored out of ten with a project scored out of one hundred without forcing everything onto one raw point pool first.
Input contract, rounding, and error behaviour
Optional label names the category for the breakdown. Weights need not sum to one hundred—the engine renormalizes automatically—so you can enter thirty, thirty, forty or zero point three, zero point three, zero point four with the same ratios and the same mark. POST a JSON body with two required fields. categories is a non-empty array of up to fifty objects; each object must include score (non-negative finite points earned), max_score (strictly positive points possible), and weight (strictly positive relative weight). Aliases items, rows, and components map to categories. out_of is the strictly positive target total for the combined mark; aliases total, scale, and max_mark are accepted. Optional decimals is an integer from zero to six inclusive and defaults to two; alias precision is accepted. On success the response includes mark (rounded half-up to decimals), out_of, mark_display such as 16.62 / 20, weighted_percent, weighted_ratio, total_weight, category_count, decimals, a categories array with ratio, weight_share, and contribution_to_mark per row, plus formula and method weighted_category_scale for stable clients. Missing categories or out_of, empty arrays, non-objects in the list, negative scores, non-positive max_score or weight, non-positive out_of, and decimals outside zero through six fail with invalid_input and messages that name the field; validation failures are not billed.
Where a mark-out-of-N weighted API earns its keep
Teachers who grade in mixed instruments but report on a fixed institutional scale need one oracle that students, parents, and spreadsheets can all trust. Tutors can walk a learner through each category contribution without inventing custom arithmetic each session. Failed validation does not consume balance. Advising offices near midterms answer how much is this out of twenty after weights dozens of times; a shared deterministic endpoint removes Discord-bot drift and hand calculator mistakes. Keep requests small, pin mark and mark_display in tests, and you get reproducible scaled marks for classroom demos, edge workers, and syllabus calculators without standing up custom grading infrastructure of your own.
Integration use cases
Note sur 20 from mixed categories
Enter homework, exam, and project rows with their own max scores and weights, set out_of to 20, and read the combined mark as mark_display.
LMS and tutoring automation
Call the same deterministic API from portals or tutor tools so every client agrees on the scaled mark for identical inputs.
Technical questions
How does the weighted score out of total calculator work?
For each category it divides score by max_score, multiplies by weight, sums those products, divides by the total weight, multiplies by out_of, and rounds half-up to the requested decimals.
Can categories use different maximums?
Yes. Each row has its own max_score, so a quiz out of 10 and a project out of 100 can sit in the same weighted mark.
What does the weighted score out of total tool cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.