Total Float vs. Free Float: What Each One Tells You
Total float tells you how far an activity can slip before the project finish moves. Free float tells you how far it can slip before the next activity moves. They sound similar, they're often confused, and the difference is exactly where trade coordination problems come from. This post shows how each is calculated on a small rough-in example, why total float is shared along a path while free float isn't, and what each number is good for on a real job.
The definitions
Using the 0-based convention (first activity starts at 0, EF = ES + duration, successor ES = predecessor EF):
- Total float (TF) = LS − ES = LF − EF. The amount an activity can be delayed without delaying the project finish (or whatever end date the backward pass is measured against).
- Free float (FF) = min(ES of all successors) − EF, for finish-to-start relationships with zero lag. The amount an activity can be delayed without delaying the early start of any successor.
Total float is a path property dressed up as an activity property. Free float really is an activity property. That one distinction explains almost everything else in this post.
A worked example: level 3 rough-in
Here's a piece of a multi-story wood-frame schedule. The milestone "Level 3 ready for drywall" can't happen until the exterior envelope is closed in and the in-wall rough-in has passed inspection. Durations are working days. All relationships are FS with zero lag.
| ID | Activity | Duration | Predecessors |
|---|---|---|---|
| A | Frame exterior walls, L3 | 5 | none |
| B | Sheathing, WRB, and windows, L3 | 15 | A |
| X | Plumbing rough-in, L3 | 3 | A |
| Y | Electrical rough-in, L3 | 4 | X |
| Z | Rough-in inspection, L3 | 2 | Y |
| M | L3 ready for drywall (milestone) | 0 | B, Z |
Forward pass:
A: ES 0, EF 5
B: ES 5, EF 20
X: ES 5, EF 8
Y: ES 8, EF 12
Z: ES 12, EF 14
M: ES = max(20, 14) = 20, EF 20
Backward pass from 20:
M: LF 20, LS 20
B: LF 20, LS 5
Z: LF 20, LS 18
Y: LF 18, LS 14
X: LF 14, LS 11
A: LF = min(LS of B, LS of X) = min(5, 11) = 5, LS 0
The results:
| ID | Activity | ES | EF | LS | LF | TF | FF |
|---|---|---|---|---|---|---|---|
| A | Frame exterior walls | 0 | 5 | 0 | 5 | 0 | 0 |
| B | Sheathing, WRB, windows | 5 | 20 | 5 | 20 | 0 | 0 |
| X | Plumbing rough-in | 5 | 8 | 11 | 14 | 6 | 0 |
| Y | Electrical rough-in | 8 | 12 | 14 | 18 | 6 | 0 |
| Z | Rough-in inspection | 12 | 14 | 18 | 20 | 6 | 6 |
| M | Ready for drywall | 20 | 20 | 20 | 20 | 0 | 0 |
Check the free float numbers. X's successor is Y, ES 8; X's EF is 8, so FF = 0. Y's successor is Z, ES 12; Y's EF is 12, so FF = 0. Z's successor is M, ES 20; Z's EF is 14, so FF = 6.
Float is shared
Look at X, Y, and Z. Each one shows 6 days of total float. That doesn't mean there are 18 days of slack in the rough-in chain. There are 6, and all three activities are looking at the same 6.
Here's how that plays out. The plumber looks at the schedule, sees 6 days of float, and starts 4 days late because another job needed the crew. Nothing happens to the milestone. The project finish didn't move, so from the plumber's point of view nobody was hurt.
But the electrician's early start just moved from day 8 to day 12. Electrical now has 2 days of total float, not 6. The inspection has 2. If the electrician then loses 3 days to a material shortage, the chain finishes on day 21 instead of 20 and the drywall milestone is late. The electrician gets blamed, even though the float that would have absorbed their delay was spent by someone else a week earlier.
That's what free float would have told you. The plumbing rough-in has zero free float. Any slip at all pushes the electrician. Only the inspection, at the end of the chain, has free float of its own.
The general pattern: in a chain of activities with no merges, total float is the same all the way along, and free float is zero everywhere except the last activity before a merge point. The last activity holds all the free float for the chain.
What each number is good for
| Question | Use |
|---|---|
| Will this delay the project finish or a contract milestone? | Total float |
| Is this activity on or near the critical path? | Total float |
| Will this delay the next trade? | Free float |
| Can this sub start late without affecting anyone else? | Free float |
| How much schedule risk is in this path? | Total float, tracked over updates |
| Where can I level resources without knock-on effects? | Free float |
In practice:
- Superintendents and foremen care most about free float. "Can I pull my crew off Level 3 for two days?" is a free float question. If the answer is zero, someone else is waiting.
- Schedulers and PMs care most about total float, because it's what tells you whether the end date is at risk and where to focus. Watching total float erode on a path from one update to the next is one of the better early warnings you get. See Near-Critical Paths and Why They Deserve Attention.
- Owners' reps and claims people care about total float because it's the basis of most delay analysis, and because the question of who gets to use it is a contract question. See Who Owns the Float?.
Negative float
Total float can be negative. That happens when the backward pass starts from a date earlier than the forward pass can achieve, usually because of a "finish on or before" constraint on a milestone or a contract completion date.
Say the drywall milestone in the example has a constraint: finish on or before day 17, because the drywall sub is mobilizing for that floor on day 18. The forward pass still says day 20. The backward pass now starts from 17:
M: LF 17, LS 17
B: LF 17, LS 2 TF = 2 - 5 = -3
Z: LF 17, LS 15 TF = 15 - 12 = 3
The envelope path now shows −3: you're three days behind where you need to be. The rough-in path shows +3, half of what it had. Negative float doesn't move any dates. It tells you how much you need to recover. See Schedule Constraints for more on how constraints affect float.
Free float, by the usual definition, doesn't go negative in an unconstrained network, because the forward pass never lets a successor start before its predecessor finishes.
Free float with lags and other relationship types
The simple formula assumes FS with zero lag. With lags or other types, free float is measured against whatever the relationship requires:
- FS with lag L: FF = successor ES − L − predecessor EF.
- SS with lag L: FF = successor ES − L − predecessor ES.
- FF with lag L: FF = successor EF − L − predecessor EF.
When an activity has several successors, take the smallest result across all of them. Different tools handle the edge cases (multiple calendars, mixed relationship types) a little differently, so if a number looks wrong, check how your software defines it before assuming the logic is broken.
Things float numbers won't tell you
- High float is often a logic error. An activity with 80 days of total float usually isn't that flexible. It's missing a successor. See Open Ends and Dangling Logic.
- Float is in working days of the activity's calendar. Two linked activities on a 5-day and a 6-day calendar can show different total float on what is effectively the same path.
- Float isn't a promise. It's the result of this month's logic and durations. Next month's update may take it away.
Key takeaways
- Total float protects the project finish. Free float protects the next activity.
- Total float is shared along a path. When one activity uses it, everyone downstream loses it.
- In a simple chain, free float sits on the last activity before a merge. Everything upstream has zero.
- Negative total float means you're behind a constrained date. It doesn't move dates; it measures the gap.
- Use free float for daily crew decisions and total float for project-level risk.