php 变量中用max,为什么具有PHP_INT_MAX值的两个浮点变量是相同的,除非其中一个值的值大于1025...

使用float,您的假设$x == $x 1不一定是真的:

$x=2;

echo ((float)($x+1)==(float)($x))?'EQUAL':'Not Equal';

收益率“不等于”.

在注释(http://www.h-schmidt.net/FloatConverter/IEEE754.html)中链接的转换器中,您可以重现这一点.十进制2.0产生0x40000000,十进制3.0产生0x40400000,因此它们在IEEE754浮点表示方面确实不同.

然而,例如,十进制0.1不能表示为float: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),它将转换为float,当你添加一个float($x 1026.0)时,它当然也是浮点数.但是,显然,它们在内部并不相同,请参阅上面的比较.

底线:

>不要比较浮点数是否相等

>小心你的演员阵容; (float)($x 1026)是一个整数加法,然后转换为float,而(float)($x 1026.0)将$x转换为float,然后添加float 1026.0,然后(多余)转换为float.

编辑:另外,请参阅:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值