Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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中字符串的浮点和整数转换相乘,会得到不同的结果_Php_Casting_Floating Point_Int_Rounding - Fatal编程技术网

手工将php中字符串的浮点和整数转换相乘,会得到不同的结果

手工将php中字符串的浮点和整数转换相乘,会得到不同的结果,php,casting,floating-point,int,rounding,Php,Casting,Floating Point,Int,Rounding,我用我正在使用的代码解决了这个问题,但这是一个让我头疼的问题 我知道在某些情况下,浮点运算会弄乱舍入。 我知道php使用类型推断,当您在字符串之间进行算术运算时(我的意思是,在本例中,在我的示例中),会自动转换 通过“手工输入代码”执行相同的操作,160.2*50的结果是8010,当转换为整数结果时不需要舍入。这只是一个意外。 如果有人知道为什么会发生这种情况,那将给我以启示 echo "160.2" * "50"; // gives 8010 echo (int) ((float)"160.2

我用我正在使用的代码解决了这个问题,但这是一个让我头疼的问题

我知道在某些情况下,浮点运算会弄乱舍入。 我知道php使用类型推断,当您在字符串之间进行算术运算时(我的意思是,在本例中,在我的示例中),会自动转换

通过“手工输入代码”执行相同的操作,160.2*50的结果是8010,当转换为整数结果时不需要舍入。这只是一个意外。 如果有人知道为什么会发生这种情况,那将给我以启示

echo "160.2" * "50"; // gives 8010
echo (int) ((float)"160.2" * (int)"50"); // Gives 8009
我解决了这个问题,我的代码正在运行;这只是为了好玩。我想知道为什么以及如何一步一步地让php搞砸了。php在哪里失去分辨率?在哪一步

提前感谢:)

php在哪里失去分辨率?在哪一步

当您将结果强制转换为int时。最初,结果是浮点数,如果您在php设置中提高精度,您将看到它类似于
8009.999999999090529822770718
,将正数强制转换为int与调用
floor()
,基本相同,这就是为什么它在内部打印
8009

PHP表示
(float)“160.2”
,作为
160.1999999995343387126…
的二进制等价物。这将导致乘法结果略小于8010,这会在返回int时导致截断并导致8009

二进制中的160.2无法完美表示。结果是一个循环小数

10100000.00110011001100110011001100110011...
因此,您不能期望它用float精确表示