手动将PHP中的字符串浮点数和整数相加得到不同的结果

时间:2012-10-27 20:49:41

标签: php casting floating-point int rounding

我用我正在使用的代码解决了这个问题,但这会让我感到困惑。

我知道某些环境中的浮点只会因为四舍五入而变得混乱。 我知道php使用类型推断,并且当你在字符串之间进行逻辑操作时会有一个自动转换(我的意思是,在我的例子中,在这个特例中)。

在代码中手动执行相同的操作,160.2 * 50的结果是8010,当转换为整数结果时不需要舍入。只是尴尬。 如果有人知道为什么会发生这种情况,那就会让我感到高兴。

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

我解决了这个问题,我的代码现在正在运行;这只是为了好玩。我想知道为什么以及如何,一步一步地用这个搞砸了。 php丢失解决方案在哪里?在哪一步?

提前致谢:)

2 个答案:

答案 0 :(得分:2)

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

160.2二进制文件无法完美表示。它是一个重复的小数,

10100000.00110011001100110011001100110011...

所以你不能指望用float来准确表示它。

(的 Converter

答案 1 :(得分:1)

  

php丢失解决方案在哪里?在哪一步?

将结果转换为int时。最初,结果是浮点数,如果你在php设置中增加精度,你会发现它类似于8009.9999999999990905052982270718,向int投射正数与调用floor()基本相同,这就是它打印的原因{ {1}}。