PHP的intval()和strval()发生了什么?

时间:2010-12-25 12:59:11

标签: php

所以我明白了:

$n = "19.99";

echo (int) ($n * 100);
echo (int) strval($n * 100);

输出:

1998
1999

我只是不明白。发生了什么? $n * 100是1999(浮动),为什么它们不一样呢?

3 个答案:

答案 0 :(得分:6)

浮点数没有任意精度。 19.99 * 100的结果实际上表示为1998.9999999999

如果您打印它,它将显示为1999。这就是strval()的作用。而(int)将使其失效。

答案 1 :(得分:2)

同时检查......

http://php.net/manual/en/function.ceil.php

http://php.net/manual/en/function.floor.php

http://php.net/manual/en/function.round.php

你会看到一切如何运作。

echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9
echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9

答案 2 :(得分:0)

要将两个任意精度的数字相乘,请使用bcmul函数。

echo (int)(bcmul('19.99', '100')); // 1999
echo (int)(19.99 * 100); // 1998

请注意,bcmul函数的两个操作数是字符串,因为根据php.net

  

将float类型的值传递给BCMath函数,该函数期望将字符串作为操作数,这可能无法达到预期的效果,这是因为PHP将float值转换为字符串的方式,即该字符串可能采用指数表示法( BCMath),并且小数点分隔符是语言环境相关项(而BCMath始终期望小数点)。