In Final Fantasy XIV, the Critical Hit substat affects both the probability of landing a critical hit and the damage multiplier applied when a critical hit occurs. Unlike other stats that may have linear gains, FFXIV stats operate on tiers (integer math). This means adding +1 to your stat might not actually increase your percentage until you reach the next "tier threshold."
How the Formula Works
The game calculates percentages using specific constants that depend on your player level. The core formula uses a divisor (Level Div) and the base substat value for that level.
Base Crit Rate: 5% (Always)
Base Crit Damage: 140%
Level 100 (Dawntrail): Base Stat = 420, Divisor = 2780
Level 90 (Endwalker): Base Stat = 400, Divisor = 1900
Optimization Tips
Because of the tiering system, it is possible to "waste" stat points. If you are 1 point away from the next tier, melding a small materia is highly effective. If you are 1 point over a tier, those extra points provide zero benefit. Use this calculator to ensure your gear melds hit exact breakpoints.
Stat Tiers Example (Level 90)
Crit Stat
Rate %
Damage Multiplier %
400 (Base)
5.0%
140.0%
1000
11.3%
146.3%
2000
21.8%
156.8%
2500
27.1%
162.1%
function calculateCrit() {
// Get inputs
var levelSelect = document.getElementById("playerLevel");
var level = parseInt(levelSelect.value);
var statInput = document.getElementById("critStat").value;
var stat = parseFloat(statInput);
// Constants based on level
var levelDiv = 1900; // Default Lv 90
var baseStat = 400; // Default Lv 90
if (level === 100) {
levelDiv = 2780;
baseStat = 420;
} else if (level === 90) {
levelDiv = 1900;
baseStat = 400;
} else if (level === 80) {
levelDiv = 1300;
baseStat = 380;
} else if (level === 70) {
levelDiv = 900;
baseStat = 364;
}
// Validation
if (isNaN(stat) || stat < 0) {
alert("Please enter a valid Critical Hit stat value.");
return;
}
// FFXIV bounds: Stat cannot be lower than base
if (stat = val + 1
// (NextStat – Base) / Div >= (val + 1) / 200
// NextStat – Base >= Div * (val + 1) / 200
// NextStat >= (Div * (val + 1) / 200) + Base
var nextTierVal = val + 1;
// We use Math.ceil because any fraction means we haven't reached the integer breakpoint in the division
var nextStatReq = Math.ceil((nextTierVal * levelDiv / 200) + baseStat);
var diff = nextStatReq – stat;
var msg = "";
if (diff > 0) {
msg = "You need " + diff + " more points to reach the next tier (" + ((nextTierVal+50)/10).toFixed(1) + "% rate).";
} else {
// This handles the exact tier hit case, checking the NEXT one
var nextNextVal = val + 1;
var nextNextStat = Math.ceil((nextNextVal * levelDiv / 200) + baseStat);
// If we are exactly on a tier, logic holds, but sometimes floating point precision requires care.
// Re-evaluating logic for exact tier hit:
if (stat >= nextStatReq) {
// Technically shouldn't happen with the ceil logic unless exact match
nextTierVal++;
nextStatReq = Math.ceil((nextTierVal * levelDiv / 200) + baseStat);
diff = nextStatReq – stat;
msg = "You are exactly on a tier! Next tier requires " + diff + " more points.";
} else {
msg = "You need " + diff + " more points to reach the next tier (" + ((nextTierVal+50)/10).toFixed(1) + "% rate).";
}
}
document.getElementById("tierMsg").innerHTML = msg;
}