There’s no difference in the resulting value, just:
(float)is a language feature and very quickfloatval()incurs the overhead of a function call (minimal, but nonetheless…)floatval()as a function can be used in ways that(float)cannot, e.g.array_map('floatval', $foo)
The last point is, I believe, the main reason for floatval‘s existence: so each casting operation has a function equivalent, which can be useful in some circumstances.