PHP浮点到int类型转换的意外结果

PHP浮点到int类型转换的意外结果,php,casting,floating-point,type-conversion,Php,Casting,Floating Point,Type Conversion,我正在尝试在php中将浮点值转换为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 这是因为以10为基数的有限表示形式的数字在PHP使用的浮点表示形式中可能有也

我正在尝试在php中将浮点值转换为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

这是因为以10为基数的有限表示形式的数字在PHP使用的浮点表示形式中可能有也可能没有精确的表示形式

>php-r“echo变量转储(sprintf('.40F',39.3*100.0)) 字符串(45)“3929.999999999545252649119358810424804688” 由于
int
总是将数字向下舍入,因此表示法中的一个小错误会使强制转换将其向下舍入一个数字,而这是您所期望的


考虑改用。

您应该看看此页:。 它描述了使用浮点数时的陷阱

// 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));

这可能会很晚,但正确的方法如下:

(int) bcmul(39.3, 100.0); // 3930
(int) bcmul(39.2, 100.0); // 3920
对于处理浮点数/计算,或者任何涉及货币交易的事情,你不应该直接使用乘法/除法+转换

请同时参阅:


注意:我的答案中的转换只是将字符串转换为Int(您不需要这样做)

一个简短的提示,希望您期望的是3930,而不是3939。另一个很好的参考资料表明,这是大多数计算机语言的常见问题,即您不应该使用字符串或圆形,bcmul函数的存在是有目的的。
(int) bcmul(39.3, 100.0); // 3930
(int) bcmul(39.2, 100.0); // 3920