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