用PHP手动将字符串强制转换为整数和浮点数后相乘结果不同

3
我解决了我正在工作的代码问题,但这是一些困扰我的事情。 我知道在某些情况下,浮点数会干扰四舍五入。 我知道php使用类型推断,在字符串之间进行算术运算时存在自动转换(我的意思是,在这种特定情况下,在我的示例中)。
手动编写代码执行相同的操作时,160.2 * 50的结果为8010,此时不需要对整数结果进行四舍五入。 这很尴尬。 如果有人知道为什么会发生这种情况,那将启迪我。
echo "160.2" * "50"; // gives 8010
echo (int) ((float)"160.2" * (int)"50"); // Gives 8009

我解决了问题,我的代码现在可以工作了;这只是为了好玩。我想知道为什么和如何,逐步了解php是如何混淆这个的。Php在哪一步失去了分辨率?
感谢您提前的帮助 :)
2个回答

4
PHP将(float)"160.2"表示为内部的二进制等价物160.19999999995343387126...。这会导致乘法结果略小于8010,再转换为int时发生截断,导致结果为8009。
160.2在二进制中无法完美表示。它变成了一个循环小数。
10100000.00110011001100110011001100110011...

因此,你不能指望用浮点数精确表示它。

(转换器)


1
PHP 在哪个步骤失去了精度?

当您将结果转换为 int 时。原始结果是浮点数,如果在 PHP 设置中增加精度,您会发现它类似于 8009.9999999999990905052982270718,将正数强制转换为 int 基本上相当于调用 floor(),这就是为什么它打印出 8009 的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接