Why not just use a variable?
Let's consider a new example - a very large video game you are working on a large programming team. There are thousands of fixed values about player abilities, classes, and weapons. You might represent some of those values as constants:
final int ROGUE_BASE_HEALTH_PER_LEVEL = 5;
final int FIREBALL_MIN_DAMAGE = 8;
final int FIREBALL_MAX_DAMAGE = 48;
final double CRITICAL_HIT_CHANCE = .05;
If these were these variables, there's nothing stopping anyone on the team from changing those values anywhere in the code. Imagine, for a moment, they are variables.
double criticalHitChance = .05;
What if Kyle the intern writes the following line of code, trying to detect if a user scored a critical hit.
double roll = Math.random(); // Random number between 0 and 1
if(criticalHitChance = roll)
Kyle forgot that we use the equality operator (==) to test equivalence rather than the assignment operator (=), and in his code above he accidentally changed the value of criticalHitChance to a random number. Now everything's a mess across the whole program. Way to go, Kyle.
Using constants prevents us from making errors. Even when you're working on a problem alone, you will make mistakes. All of us are Kyle sometimes. So if a value isn't ever meant to change, use a constant.