我用我正在使用的代码解决了这个问题,但这会让我感到困惑。
我知道某些环境中的浮点只会因为四舍五入而变得混乱。 我知道php使用类型推断,并且当你在字符串之间进行逻辑操作时会有一个自动转换(我的意思是,在我的例子中,在这个特例中)。
在代码中手动执行相同的操作,160.2 * 50的结果是8010,当转换为整数结果时不需要舍入。只是尴尬。 如果有人知道为什么会发生这种情况,那就会让我感到高兴。
echo "160.2" * "50"; // gives 8010
echo (int) ((float)"160.2" * (int)"50"); // Gives 8009
我解决了这个问题,我的代码现在正在运行;这只是为了好玩。我想知道为什么以及如何,一步一步地用这个搞砸了。 php丢失解决方案在哪里?在哪一步?
提前致谢:)
答案 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}}。