使用 float,您的假设 $x == $x + 1 不一定正确:
$x=2;
echo ((float)($x+1)==(float)($x))?'EQUAL':'Not Equal';
产生“不相等”。
在 cmets (http://www.h-schmidt.net/FloatConverter/IEEE754.html) 中链接的转换器中,您可以重现此内容。十进制2.0 产生0x40000000,十进制3.0 产生0x40400000,因此它们在IEEE754 浮点表示方面确实有所不同。
而,例如,十进制 0.1 不能表示为浮点数:0x3dcccccd,即 0.10000000149011612。
什么是小数 9223372036854775807?那是0x5f000000,即9.223372E18,即9223372180000000000。
什么是小数 9223372036854775808 (PHP_MAX_INT + 1)?那也是0x5f000000。
什么是小数 9223372036854776832 (PHP_MAX_INT + 1025)?那也是0x5f000000。
什么是小数 9223372036854776833 (PHP_MAX_INT + 1026)?那也是0x5f000000。
它们都是一样的。
而,例如:十进制 9223373000000000000 (PHP_MAX_INT + 963145224193)?那是0x5f000001,即9.223373E18,即9223373000000000000。
现在,为什么会这样:
((float)($x+1025)==(float)($x+1026))?'EQUAL':'Not Equal';
产生“不等于”?
您正在向PHP_MAX_INT 添加一个整数。
$x=PHP_INT_MAX;
$y=PHP_INT_MAX-1;
$z=PHP_INT_MAX+1;
var_dump($x);
var_dump($y);
var_dump($z);
产量:
int(9223372036854775807)
int(9223372036854775806)
float(9.2233720368548E+18)
PHP 隐式转换太大而无法浮动的整数。这就是您基本上迷失在 PHP 内部的地方(至少在我看来),因为从这里开始,您将永远不知道会发生什么(尽管不了解 PHP 内部,请随时纠正我)。
注意这一点:
$x=PHP_INT_MAX;
$a=(float)($x+1025.0); // 1025 float
$b=(float)($x+1026.0); // 1026 float
$c=(float)($x+1025); // 1025 int
$d=(float)($x+1026); // 1026 int
var_dump($x);
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($a==$b);
var_dump($a===$b);
var_dump($c==$d);
var_dump($c===$d);
产量:
int(9223372036854775807)
float(9.2233720368548E+18)
float(9.2233720368548E+18)
float(9.2233720368548E+18)
float(9.2233720368548E+18)
bool(true)
bool(true)
bool(false)
bool(false)
如果你在PHP_MAX_INT 上加上一个整数($x+1026),它就会被转换为浮点数,当你加上一个浮点数($x+1026.0)时,它当然也是浮点数。但是,显然,它们在内部并不相同,请参见上面的比较。
底线:
- 不要比较浮点数是否相等
- 小心你的演员阵容;
(float)($x+1026) 是一个整数加法,然后转换为浮点数,而(float)($x+1026.0) 将$x 转换为浮点数,然后添加浮点数1026.0,然后(多余地)转换为浮点数。
编辑:另外,请参阅: