Say you move 100 dollars from account A to account B. The transaction reads A's balance, checks it is at least 100, subtracts 100 from A, and adds 100 to B. Now imagine two transfers from account A run at the same time and A only has 100 dollars.
Under Read Committed, both transactions can read the balance as 100, both see it as sufficient, and both proceed, leaving A overdrawn by 100. This is a check-then-act race on a single row. Read Committed did its job of hiding uncommitted data, but it did not stop two transactions from making decisions on the same stale snapshot.
Under Serializable, the database detects that these two transactions could not have happened in any serial order without conflict, aborts one of them, and you retry it. The retried transaction now sees the updated balance, finds it insufficient, and correctly rejects the second transfer. This is exactly the class of bug that picking the right isolation level prevents.