Olá.
Direto ao ponto: um número mágico é todo número literal que possui um significado não esclarecido ou não documentado no código. É aquele número que você encontra em fórmulas, cálculos, instruções condicionais e métodos e que não é possível inferir o seu significado.
Imagine encontrar um trecho de código assim:
imposto = valorMovimentado * 0.38
O que significa esse 0.38 na expressão? Você poderia chutar que seria a CPMF mas seria melhor que o código estivesse assim:
constanteCPMF = 0.38
imposto = valorMovimentado * constanteCPMF
Vê a diferença? Ao invés de utilizar números diretamente em suas expressões é mais saudável criar constantes para representá-los e utilizá-las nas expressões. O código fica mais legível e mais prático para sofrer manutenções.
Além disso, imagine se o valor 0.38 fosse utilizado em 30 lugares diferentes? Caso o valor mudasse para 0.35 seria necessário alterar todos os 30 lugares. Porém, caso tivesse sido utilizado uma constante, bastaria alterar a constante num único lugar e todos os outros 30 estariam automaticamente adequados. Muito melhor, certo?
Martin Fowler, no livro "Refatoração: Aperfeiçoando o Projeto de Código Existente", chama esse padrão de "Substituir número mágico por constante simbólica". Este livro é fonte muito recomendável para o aprendizado de padrões de refatoração como o que mostrei acima. É um excelente guia de consulta também.
O autor mantém um site na internet (em inglês) sobre refactoring que é referência para o assunto: site Refactoring.
Espero que seja útil.
Eduardo.