The CS2 Trade-Up Float Averaging Formula (Derived, With Worked Examples)
The output float of a CS2 trade-up contract is fully deterministic given the ten input floats. No RNG, no fudge factor — one formula, two parameters per output skin, four decimal places of precision. Yet half of the recipes posted on r/csgomarketforum get the math wrong because the float clip of the output skin is invisible in the contract panel and the formula stops being intuitive the moment one of your inputs sits outside the unit interval.
This article derives the formula, shows why naive averaging fails, and walks five real recipes through the math from input floats to output exterior. For the broader contract mechanic (collection weight, the rarity ladder, EV math), see the trade-up contracts pillar. For the step-by-step UI walkthrough, see how to do a trade-up contract.
The formula in one line
output_float = (sum_of_input_floats / 10) × (skin_max − skin_min) + skin_min
Where:
- sum_of_input_floats is the literal sum of the float values on the ten inputs, each between 0.000 and 1.000.
- skin_max is the upper float boundary of the output skin's wear clip, as defined in
items_game.txt. - skin_min is the lower float boundary of the output skin's wear clip.
The formula is applied per output skin — when the collection draw picks one of multiple possible output skins, the float math runs against that specific skin's clip, not against a generic range.
Why the formula has two stages
A trade-up contract does two things to floats:
- Averages the inputs. Sum the ten input floats, divide by ten. This produces a value between 0.000 and 1.000.
- Maps the average onto the output skin's float clip. The averaged value is multiplied by the output's float range, then offset by the output's minimum.
Stage one is straightforward. Stage two is the trap. The output skin does not necessarily ship in the 0.000–1.000 range — most skins have a clipped range. AK-47 Redline ships 0.10–0.70. AWP Asiimov ships 0.18–1.00. Sawed-Off Wasteland Princess ships 0.06–0.80. The clip is per-skin and lives in items_game.txt; Steam Market does not display it inline.
What "mapping onto the clip" means in practice: a 0.18 input average produces a 0.18 output float on an unclipped skin (0.00–1.00 clip), but on an Asiimov-style 0.18–1.00 clip it produces:
output_float = 0.18 × (1.00 − 0.18) + 0.18 = 0.18 × 0.82 + 0.18 = 0.1476 + 0.18 = 0.3276
That 0.3276 lands in Field-Tested, not the Factory New a naive read would expect. The clip pushes the result up. This is why "I fed FN inputs and got Field-Tested output" happens constantly on Asiimov trade-ups.
The derivation
The formula is stated in Valve's engine code (items_game.txt plus the trade-up contract handler in the CS2 binary), but the structure follows from two design goals Valve had in 2014:
Goal 1: ten inputs at uniform floats should produce a deterministic output float, so players can predict the outcome.
This is the averaging step. Replace any of the ten inputs with a different float of the same average, and the result is identical. Eight people running the same recipe with floats 0.10/0.10/0.10/0.10/0.10/0.10/0.10/0.10/0.10/0.10 get the same output float as one running 0.05/0.05/0.05/0.05/0.05/0.15/0.15/0.15/0.15/0.15. Variance in the per-input float distribution is invisible to the output.
Goal 2: the float clip of the output skin must be respected, so a contract cannot produce an out-of-clip output.
Without stage two, feeding sub-0.07 inputs to a 0.18-clipped Asiimov output would produce a 0.05 Asiimov, which does not exist in the game (Asiimov has no Factory New skin to ship). The mapping rescales the averaged input into the legal range of the output, preserving the linear ordering: lower input average → cleaner output, higher input average → dirtier output, but always inside the output skin's clip.
The linear-rescale stage is equivalent to:
output_float = skin_min + (input_avg − 0) × ((skin_max − skin_min) / (1 − 0))
which simplifies to the published one-line form.
What the formula does NOT do
Three behaviours the formula explicitly does not have, and which trip up players who reverse-engineer it:
- It does not clamp. If the math produces a value outside the float clip (which can only happen via floating-point arithmetic rounding), the engine writes the raw value. In practice this only matters at extreme floats and the error is on the order of 1e-7, invisible.
- It does not adjust for input variance. Ten inputs at 0.10 average produce the same output as ten inputs at the same average from different specific values. Players sometimes try to "smooth" the input distribution; the contract does not care.
- It does not weight by input collection. Float averaging is uniform across the ten inputs, regardless of which collection each input came from. The collection weight only affects which output skin pool is drawn from; once the output skin is picked, all ten input floats average uniformly into the formula.
The wear thresholds, mapped onto output float
Once the formula produces an output float, the exterior bucket follows the standard CS2 mapping:
| Output float | Exterior |
|---|---|
| 0.00 – 0.07 | Factory New |
| 0.07 – 0.15 | Minimal Wear |
| 0.15 – 0.38 | Field-Tested |
| 0.38 – 0.45 | Well-Worn |
| 0.45 – 1.00 | Battle-Scarred |
The bucket boundaries are universal. The float clip of the output skin determines which buckets it can reach: a 0.18–1.00 clipped Asiimov can never produce Factory New or Minimal Wear, no matter how low the input average. A 0.00–0.70 clipped Case Hardened can never produce a deep Battle-Scarred (above 0.70).
The full exterior table and the float-vs-pattern dynamic is covered in the skin conditions article and the float value glossary entry.
Five worked examples
Real recipes, walked through end to end. Prices are illustrative — verify on Steam Market before running.
Example 1 — Tight FN target on an unclipped Mil-Spec output
- 10 inputs averaging 0.04 float
- Output skin clip: 0.00–1.00 (unclipped Mil-Spec rifle)
- Output float: 0.04 × (1.00 − 0.00) + 0.00 = 0.04 → Factory New
This is the "naive" case: unclipped output, low input average maps directly. Most Mil-Spec rifle outputs ship in the full 0.00–1.00 range, so cheap low-float Field-Tested inputs (which often trade at sub-0.20 prices in CSFloat or tradeit listings) can be averaged down to land FN outputs reliably.
Example 2 — Asiimov clipping wrecks a Factory New target
- 10 inputs averaging 0.04 float (same as above)
- Output skin clip: 0.18–1.00 (AWP Asiimov class)
- Output float: 0.04 × (1.00 − 0.18) + 0.18 = 0.04 × 0.82 + 0.18 = 0.0328 + 0.18 = 0.2128 → Field-Tested
Same input average, completely different exterior. The Asiimov-style clip starts at 0.18, so the lowest possible output float on any input combination is 0.18 (when the input average is exactly 0). FN is unreachable. The cleanest exterior the recipe can produce is Field-Tested at the bottom edge.
This is the structural reason Asiimov trade-ups disappoint when traders try to target Minimal Wear or Factory New outputs.
Example 3 — Mid-clip output, MW target
- 10 inputs averaging 0.18 float
- Output skin clip: 0.00–0.50
- Output float: 0.18 × (0.50 − 0.00) + 0.00 = 0.09 → Minimal Wear
A 0.00–0.50 clipped output is common on Mil-Spec and Restricted skins. With Field-Tested inputs averaging 0.18, the output lands solidly in Minimal Wear. To target Factory New, you would need input average under 0.14 (0.14 × 0.50 = 0.07).
Example 4 — Case Hardened clipping caps the dirty end
- 10 inputs averaging 0.55 float
- Output skin clip: 0.00–0.70 (Case Hardened style)
- Output float: 0.55 × (0.70 − 0.00) + 0.00 = 0.385 → Well-Worn (just barely)
The 0.70 upper clip on Case Hardened skins means you cannot reach Battle-Scarred no matter how dirty the inputs. The dirtiest possible Case Hardened output is around 0.70 (input average exactly 1.00, which is physically impossible — inputs are themselves capped at 1.00 maximum). Practically, the worst output is 0.70 ish.
Example 5 — Heavy float-clipped output, Field-Tested-only band
- 10 inputs averaging 0.30 float
- Output skin clip: 0.20–0.45 (some Mil-Spec SMG outputs)
- Output float: 0.30 × (0.45 − 0.20) + 0.20 = 0.30 × 0.25 + 0.20 = 0.075 + 0.20 = 0.275 → Field-Tested
A narrow-clip output (0.20–0.45 range) means the entire float spectrum collapses into a small band of exteriors. From Field-Tested all the way to Well-Worn, no FN/MW/BS possible. Recipes on these outputs are float-insensitive — you can feed almost any input average and the output exterior barely shifts.
Reading the output skin's float clip
The output skin's float clip is not displayed in the contract UI. To read it before committing:
- Steam Market: open the output skin's listing page. The "Inspect in Game" link reveals the float on individual listings; scanning 20+ listings on each exterior gives the empirical clip. Tedious but accurate.
- CSFloat: every listing on csfloat.com shows the exact float. Filter by exterior to bound the clip.
- tradeit.gg / csgostash.com: both list
MinFloatandMaxFloatper skin, pulled fromitems_game.txtdirectly. Stash is the easiest read. - The
items_game.txtfile itself: if you have a CS2 install, the file is atCounter-Strike Global Offensive/csgo/scripts/items/items_game.txtand contains the canonicalwear_remap_minandwear_remap_maxper paint kit. This is the ground truth.
Most active traders cache the float clips for the 50-100 skins they trade-up against. The clip never changes after a skin ships, so the cache stays valid.
The 10-input average is the only lever
Within the formula, the only thing you control is the input average. The output skin's clip is fixed by Valve. The output skin's identity is decided by the collection-weighted draw (covered in the pillar guide), not by float.
So float optimization reduces to: find the cheapest ten inputs whose float average produces an output exterior in the price band you want.
Three tactical patterns:
Target FN on unclipped outputs
If the output skin is 0.00–1.00 clipped (most low-rarity outputs are), input average under 0.07 produces FN. Cheap Field-Tested inputs at 0.16–0.20 averaged together with one low-float input can hit this. Better: scan CSFloat for sub-0.05 FN inputs that trade at the FT price, average them down. Patient sourcing.
Target MW on mid-clip outputs
For outputs clipped 0.00–0.50, MW requires input average 0.14–0.30. This is the sweet spot of cheap FT inputs (0.15–0.35) averaging to MW outputs that trade at a 30-100% premium over the FT version. Most profitable budget recipes live here.
Don't bother targeting FN on Asiimov / Hyper Beast outputs
Float clips that start at 0.18 or higher make FN/MW unreachable. The cleanest possible Asiimov-class output is mid-Field-Tested. Players who try to target MW Asiimov outputs are misreading the clip; the recipe cannot produce that exterior.
Why the formula matters for EV
Float drives output price more than any other variable except the skin identity itself. For collector skins (Case Hardened, Fade, Doppler, Marble Fade, Crimson Web), the pattern dominates and float is secondary; for everything else, float controls the exterior, and the exterior moves the price 2-5× across the FN-to-BS spectrum.
A recipe that produces a $4 Field-Tested output 100% of the time is +0% EV on a $4 input stake. The same recipe with the input average pushed down to produce Minimal Wear outputs at $8 each is +100% EV on the same stake — and the cost of the cleaner inputs is usually only $0.50-1.00 higher per slot, well below the output premium.
The math walks the same way for every recipe. The float averaging formula is the only step you have control over after the collection weight is locked, and it is the one most traders ignore.
Common float-formula traps
Five mistakes that show up regularly on the trade-up subreddits:
- Confusing "input float average" with "input exterior average". The formula uses the raw float values, not the exterior buckets. Ten inputs all called "Field-Tested" can average anywhere from 0.15 to 0.37. The exterior label is not the float.
- Assuming all output skins have the same clip. The collection draw picks one of multiple output skins, and each has its own clip. The same input average produces different exteriors on different output skins. EV calculations need to project the float per possible output, not as a single number.
- Forgetting StatTrak and Souvenir do not affect float. The float averaging formula is identical for StatTrak contracts (Souvenir contracts do not exist). StatTrak does not narrow the clip.
- Mistaking float clipping for rounding errors. The 0.3276 output on a 0.04-input recipe for an Asiimov is not a rounding error or a bug — it is the formula working exactly as designed. The clip is the cause.
- Treating "FN" as a guaranteed exterior at low input averages. FN requires output_float ≤ 0.07. If the output skin's clip starts above 0.07, FN is impossible. Always read the clip first.
The formula vs the trade-up calculator
The trade-up calculator at /tools/trade-up-calculator (shipping week 19) automates this math: paste ten inputs, pick output collections, see projected output exterior per possible output skin, with EV computed against current marketplace prices net of fees. Until it ships, the spreadsheet workflow is:
- Column A-J: ten input floats.
- Column K: average of A-J.
- Column L: output skin's
skin_min. - Column M: output skin's
skin_max. - Column N:
=K1*(M1-L1)+L1— the output float. - Column O: a lookup that maps N onto the exterior bucket.
- Column P: the price of the output skin at the exterior in O, net of Steam fee.
Run the same formula for each possible output skin in the collection pool, weight by collection draw probability × per-skin probability within the collection, sum. That is the EV. Subtract the input cost. Decide whether to run.
FAQ
What is the exact float averaging formula in CS2 trade-ups? output_float = (sum_of_input_floats / 10) × (skin_max − skin_min) + skin_min. Inputs averaged uniformly, mapped linearly onto the output skin's float clip.
Why does my output exterior come out worse than my inputs? Float clipping on the output skin. If the output skin's clip starts above your input average, the formula pushes the output float up to the clip minimum. Asiimov-class skins clipped at 0.18 produce mid-Field-Tested outputs even from sub-0.07 inputs.
Can I always get a Factory New output if my input floats are low enough? Only if the output skin's clip starts at 0.00. Skins clipped at 0.10 or higher (Redline, Asiimov, Hyper Beast, many others) cannot produce Factory New regardless of input float.
Does float clipping affect both input and output sides?
The input side is constrained by the input skin's own clip (you can only feed in floats the skin actually ships in). The output side is constrained by the output skin's clip via the formula. Both clips are separate items_game.txt parameters.
Do StatTrak inputs use the same float formula? Yes. The float averaging formula is identical for StatTrak and non-StatTrak contracts. StatTrak is a flag on the SKU, not a float modifier.
Where can I read the output skin's float clip before running the trade-up?
Easiest: csgostash.com lists MinFloat and MaxFloat per skin from items_game.txt. CSFloat shows empirical clips by filtering exteriors. The CS2 install itself has the file at Counter-Strike Global Offensive/csgo/scripts/items/items_game.txt.
Why do the float and the exterior sometimes disagree? They do not — the exterior is just the bucket the float lands in. If your output float is 0.072, that is the boundary between FN and MW. Both Steam and third-party catalogues use the same 0.00/0.07/0.15/0.38/0.45 boundaries; a value of exactly 0.07 lands Minimal Wear by convention.
Want to see what the trade-up output is worth at every exterior in the same view? Value your CS2 inventory — multi-marketplace pricing, in one click.

