School percentage change calculator
The school percentage change calculator compares an original value with a later value and reports the difference as both an amount and a signed percentage.
Run — free
A positive result means the quantity rose, a negative result means it fell, and zero means it stayed the same. Use it for enrollment, attendance, test averages, reading totals, club participation, supply counts, or any other nonnegative school measurement with a valid starting value. The result also includes a plain-English summary so students can connect the arithmetic to its meaning.
Choose the original and new values in the right order
Percentage change always describes movement from a starting point to a later point, so order matters. Enter the earlier measurement as the original value and the later measurement as the new value. If a school library had 800 checkouts last month and 920 this month, 800 is the original value and 920 is the new value. Reversing them answers a different question and produces a different percentage because the denominator changes. Both measurements should describe the same quantity, unit, population, and time span. Do not compare a weekly attendance count with a monthly attendance count, or the number of students in one grade with the total for an entire school, unless you first make the measurements comparable. This calculator accepts nonnegative school quantities, while the original value must be greater than zero. A zero baseline cannot support an ordinary percentage-change calculation because division by zero is undefined. When the baseline is zero, report the numerical increase directly or use another comparison method instead of presenting a misleading percentage.
Understand the signed percentage change formula
The calculation first subtracts the original value from the new value. That difference is divided by the original value and then multiplied by 100. Written as a formula, percentage change equals (new value minus original value) divided by original value, times 100. Suppose average reading minutes move from 40 to 50. The numerical change is 10, and 10 divided by 40 is 0.25, so the signed percentage change is positive 25 percent. If the average moves from 50 to 40, the numerical change is negative 10, and dividing by the original 50 gives negative 20 percent. These results are not opposites because each comparison uses a different baseline. The sign communicates direction: positive means an increase, negative means a decrease, and zero means no change. The response preserves that sign in the percentage_change field and also provides an increase, decrease, or no_change direction label. Rounding is applied only to the reported change and percentage, using the requested number of decimal places, so repeated inputs produce stable results.
Explain the result clearly in schoolwork
A complete interpretation should name the quantity, identify the time periods, state the direction, and include the magnitude. For example: “The number of students attending tutoring rose from 48 in September to 60 in October, an increase of 25 percent.” This is clearer than writing only “25 percent,” because a bare percentage does not say what changed or whether it went up or down. Keep the signed result when storing data or continuing a calculation; the sign makes decreases easy to sort, chart, and aggregate. In prose, it is usually natural to use the absolute magnitude together with words such as rose or fell, which is why the generated summary says that a quantity fell by 20 percent instead of fell by negative 20 percent. Remember that percentage change describes relative movement, not percentage points. If an attendance rate rises from 80 percent to 90 percent, the increase is 10 percentage points but the relative percentage change is 12.5 percent. Check which measure an assignment requests. The same deterministic calculation runs in the browser, and an automated API request costs $0.002.
What you can do with it
Compare enrollment counts
Measure how enrollment rose or fell from one school year to the next using the earlier count as the baseline.
Track classroom participation
Compare completed assignments, reading minutes, or club attendance across two equivalent periods.
Explain a data-table trend
Generate the signed result and direction needed to write a clear sentence about a school data set.
FAQ
What formula does the calculator use?
It uses ((new value - original value) / original value) × 100 and returns the signed result.
Why must the original value be greater than zero?
The original value is the denominator. A zero baseline would require division by zero, so ordinary percentage change is undefined.
What does a negative percentage mean?
It means the new value is lower than the original value. The direction field labels this result as a decrease.
Is percentage change the same as percentage-point change?
No. Percentage change is relative to the original value, while percentage-point change is the direct difference between two percentages.
Can I choose the rounding precision?
Yes. Set decimals to an integer from 0 through 10; the default is two decimal places.
What does it cost?
The browser calculation is free, and each API request has the base price $0.002.
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/percent-change-school \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"old_value":40,"new_value":50}'const res = await fetch("https://api.kit.forhosting.com/edu/percent-change-school", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"old_value": 40,
"new_value": 50
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/percent-change-school",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"old_value": 40,
"new_value": 50
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/percent-change-school", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"old_value":40,"new_value":50}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"old_value":40,"new_value":50}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/percent-change-school", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"old_value": 40,
"new_value": 50
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.percent_change_school",
"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.
Limits
max_abs_value | 1000000000000000 |
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. |