floatの小数点以下の桁には最大精度と範囲があり、誤差が発生する場合があります。 これは使用する環境に依存し、筆者の環境では以下の通りとなります。
$tmpに代入した値と結果を比較すると、小数点7桁以降は丸められていることがわかります。
0.123456789123456789123456789↓↓
0.123457
ただし実際にはより多くの桁が保持されています。 下記の例では$tmpに「100000000000000」を掛ける事でより多くの桁まで正しく保持していることが確認できます。
0.123456789123456789123456789
↓↓
12345678912345.677734