Как исправить эту проблему?
Проблема, которую вы хотите решить? Ваш код просто показывает, что числа с плавающей запятой имеют ограниченную точность - это ничего нового.
Для большинства приложений реального мира вход, который не является 100% точным в любом случае, и результат должен быть точным до нескольких десятичных знаков. Сравнения равенства просто не являются чем-то, что вам нужно большую часть времени. Если вы это сделаете, вы можете выманить его, увидев, находится ли результат в пределах некоторого предопределенного небольшого расстояния от заданного числа.
Если вам нужна десятичная математика с определенной точностью, используйте функции BC Math - но поймите, что они очень медленны, если они используются для сложных вычислений.
Это характер чисел с плавающей запятой в целом, так что это связано с стандартом IEEE 754? –
PHP написан на языке C и поэтому получает от него поддержку FP, и в большинстве случаев C использует IEEE 754. Кроме того, IEEE 854 использует переменную radix и поэтому может поддерживать более высокую точность для некоторых номеров за счет некоторой скорости обработки, когда вычисляя с ними. –
Это характер чисел с плавающей запятой в целом. Значение epsilon (здесь 0.000000001) зависит от количества бит, представляющих поплавок. – slebetman