3

我用我正在工作的代码解决了这个问题,但这让我很烦恼。

我知道在某些情况下浮点只会与舍入混淆。我知道 php 使用类型推断,并且当您在字符串之间进行算术操作时会自动转换(我的意思是,在这种特殊情况下,在我的示例中)。

'手动编写代码'做同样的事情,160.2 * 50的结果是8010,当转换为整数结果时不需要四舍五入。只是承认。如果有人知道为什么会发生这种情况,它会启发我。

echo "160.2" * "50"; // gives 8010
echo (int) ((float)"160.2" * (int)"50"); // Gives 8009

我解决了这个问题,我的代码现在可以工作了;这只是为了好玩。我想知道为什么以及如何,一步一步地 php 搞砸了这个。php在哪里失去分辨率?在哪一步?

提前致谢 :)

4

2 回答 2

3

PHP 表示(float)"160.2"160.19999999995343387126...内部的二进制等价物。这将导致乘法结果略小于 8010,后者在转换回 int 时会导致截断并导致 8009

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

10100000.00110011001100110011001100110011...

所以你不能指望它用浮点数准确表示。

(转换器)

于 2012-10-27T21:00:18.377 回答
1

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

当您将结果转换为 int. 原来,结果是浮点数,如果你在 php 设置中增加精度,你会看到它类似于8009.9999999999990905052982270718,将正数转换为 int 与调用基本相同floor(),这就是它打印的原因8009

于 2012-10-27T20:59:15.557 回答