Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将float转换为int返回不同的值_Php_Casting - Fatal编程技术网

PHP将float转换为int返回不同的值

PHP将float转换为int返回不同的值,php,casting,Php,Casting,在PHP(v5.5.9)中执行以下代码时,会发生意外情况: $valueAsCents = 54780 / 100 * 100; var_dump($valueAsCents); var_dump((int) $valueAsCents); 这是回报 float 54780 int 54779 显然,不带小数的浮点值不等于int值。你知道这是怎么回事吗?当你除以$valueAsCents=54780/100,它就变成了一个浮点数,由于它们的存储方式,数字形式并不总是准确的。在我的测试中,我得

在PHP(v5.5.9)中执行以下代码时,会发生意外情况:

$valueAsCents = 54780 / 100 * 100;
var_dump($valueAsCents);
var_dump((int) $valueAsCents);
这是回报

float 54780
int 54779

显然,不带小数的浮点值不等于int值。你知道这是怎么回事吗?

当你除以$valueAsCents=54780/100,它就变成了一个浮点数,由于它们的存储方式,数字形式并不总是准确的。在我的测试中,我得到了
547.7999999995452526491135881042480468750000

当乘以100时,这是
54779.999999927240423858165740966796870000

当PHP转换为int时,它总是向下取整。

这就是int值为54779的原因

此外,还包含一个提示,即浮点数可能不会达到预期效果

此外,在基数10中可以精确表示为浮点数的有理数,如0.1或0.7,在基数2中不能精确表示为浮点数,无论尾数的大小,它都在内部使用。因此,如果不降低精度,就无法将其转换为内部二进制副本。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10)通常会返回7而不是预期的8,因为内部表示形式类似于7.9999999991118


echo序列化($valueAsCents)看起来像一个浮点错误。
$valueAsCents
的实际值为
54779.999999999 3
。看起来,作为一个浮点数,它正在被四舍五入(但不知道为什么),当被转换为int时,它正在被四舍五入。不管怎么说,似乎是这样。如果你使用浮点数,并期望任何形式的理性准确性,那么你就做错了。你永远无法确定什么时候某个东西会朝着错误的方向旋转一点点。浮点是二进制存储的,分辨率有限。它在一定程度上被舍入了。除以100,然后将结果乘以100,可以得出另一个数字。好吧,我很高兴我没有发疯;-)但是为什么
$valueascens 54779.999999999 3
?据我所知,它将被发送到
54779
。感谢您的明确解释。如果有人想知道,解决方法是先对结果进行
round
,然后再转换为
int