所以我明白了:
$n = "19.99";
echo (int) ($n * 100);
echo (int) strval($n * 100);
输出:
1998
1999
我只是不明白。发生了什么? $n * 100
是1999(浮动),为什么它们不一样呢?
答案 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始终期望小数点)。