PHP意外导致浮动到int类型转换

时间:2010-08-02 07:08:37

标签: php casting floating-point type-conversion

我想在php中将float转换为int值:

var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920

我可以使用ceil使其工作,但有人可以向我解释一下吗?

var_dump((int)ceil(39.3 * 100.0)); //Returns 3930

4 个答案:

答案 0 :(得分:15)

这是因为在基数10中具有有限表示的数字可能或可能不具有PHP使用的浮点表示中的精确表示。

>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"
string(45) "3929.9999999999995452526491135358810424804688"

由于int总是将数字向下舍入,因此表示中的一个小错误会使其向下舍入一个您想要的数字。

请考虑使用round

答案 1 :(得分:7)

这可能会迟到,但正确的做法如下:

(int) bcmul(39.3, 100.0); // 3930
(int) bcmul(39.2, 100.0); // 3920

并且为了处理花车的数字/计算,或涉及金钱交易的任何事情,你不应该直接使用乘法/除法+铸造。

请同时参考:

http://php.net/manual/en/book.bc.php

注意:我的回答中的转换只是将String转换为Int,(您不需要这样做)

答案 2 :(得分:1)

您应该查看此页面:http://php.net/manual/en/language.types.float.php。 它描述了使用浮点数的缺陷。

答案 3 :(得分:1)

// gives: int(3930)
var_dump(intval((39.3 * 100.0) . '')); 

或者,与函数一起使用:

function floatToInteger ($fValue)
{
    return (intval(($fValue + 0) . ''));
}

// gives: int(3930)
var_dump(floatToInteger(39.3 * 100.0));